2014-06-05 10 views
8

Voglio fare una richiesta simile:Specificare i campi restituiti in Node.js/Waterline?

User.find().exec(function(){}); 

So che posso usare toJSON nel modello però non mi piace questo approccio dato che a volte ho bisogno di diversi parametri. Ad esempio, se è l'utente che ha effettuato l'accesso, restituirò la sua e-mail e altri parametri. Tuttavia, se richiede che gli stessi dati vengano creati da un utente diverso, non include l'e-mail e un sottoinsieme più piccolo di parametri.

Ho anche provato con:

User.find({}, {username:1}) ... 
User.find({}, {fields: {username:1}}); 

ma non avendo alcuna fortuna. Come posso specificare i campi che mi servono?

risposta

12

Quindi in realtà ho trovato una soluzione alternativa per questo. il parametro fields funzionerà fino a quando si passa altri params con esso, come limit o order:

User.find({}, {fields: {username:1}}).limit(1); 

notare che questo non funziona con findOne o uno qualsiasi dei tipi di ritorno singolari. Ciò significa che nella callback dei risultati è necessario eseguire l'utente [1].

Ovviamente l'altra opzione consiste semplicemente nel rimuovere i dati dall'uscita, il che è un problema se si utilizza un elenco di articoli di grandi dimensioni. Quindi, se tutto ciò funziona per elenchi di grandi dimensioni in cui è possibile impostare effettivamente limit(20) e per singoli articoli, è possibile restituire in modo esplicito paras fino a quando select() è disponibile.

+0

Questo può funzionare accidentalmente con l'adattatore Mongo, ma non è sicuramente una soluzione affidabile, e il codice che hai postato non mostrare come recuperare effettivamente i risultati (ad esempio assegnando il codice a una variabile e chiamando ' exec' su di esso). – sgress454

5

La linea di galleggiamento non supporta attualmente alcuna sintassi di "selezione"; restituisce sempre tutti i campi per un modello. Al momento è in development e potrebbe passare alla prossima versione, ma per ora il modo migliore per fare ciò che vuoi è usare i metodi della classe del modello per creare cercatori personalizzati. Ad esempio, User.findUser(criteria, cb) potrebbe trovare un utente dare criteria e quindi verificare se si trattava dell'utente connesso prima di decidere quali dati restituire nel callback.

11

Questo è un aggiornamento alla domanda, i campi non sono più utilizzati in vele 11, si prega di utilizzare selezionare invece di campi.

Model.find({field: 'value'}, {select: ['id', 'name']}) 
    .paginate({page: 1}, {limit: 10}) 
    .exec(function(err, results) { 
    if(err) { 
     res.badRequest('reason'); 
    } 
    res.json(results); 
}); 
Problemi correlati