2014-06-05 7 views
8

Ich möchte einen Antrag machen wie:Angegebene Felder in Node.js/Waterline angeben?

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

Ich weiß, ich toJSON im Modell verwenden können, aber ich diesen Ansatz nicht mögen, da ich manchmal verschiedene Parameter benötigen. Zum Beispiel, wenn es der eingeloggte Benutzer ist, werde ich seine E-Mail und andere Parameter zurückgeben. Wenn jedoch die Anforderung für die gleichen Daten von einem anderen Benutzer gestellt wird, würde sie die E-Mail und eine kleinere Teilmenge von Parametern nicht enthalten.

Ich habe auch versucht mit:

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

Aber kein Glück haben. Wie kann ich die Felder angeben, die ich zurückgeben möchte?

Antwort

12

So fand tatsächlich eine seltsame Abhilfe für dieses. die fields param wird so lange arbeiten, wie Sie damit anderen params passieren wie limit oder order:

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

Beachten Sie, dass dies nicht mit FindOne oder einen der Einzahl Rückkehr Typen arbeiten. Dies bedeutet, dass Sie in Ihrem Ergebnis-Callback den Benutzer [1] verwenden müssen.

Natürlich ist die andere Möglichkeit ist, einfach aus Ihren Daten auf dem Weg schrubben, die einen Schmerz, wenn Sie eine große Liste von Elementen verwenden. Also, wenn alles funktioniert dies für große Listen, in denen Sie tatsächlich limit(20) setzen könnte und für einzelne Artikel können Sie nur explizit Ziffern zurück, bis select() zur Verfügung steht.

+0

Diese versehentlich mit dem Mongo Adapter arbeiten können, aber es ist definitiv nicht eine zuverlässige Lösung, und der Code, den Sie nicht gepostet nicht zeigen, wie man tatsächlich die Ergebnisse abgerufen werden (zB durch diesen Code einer Variablen zugewiesen und Aufruf ' Exec "darauf). – sgress454

5

Wasserlinie unterstützt derzeit keine keine „wählen Sie“ Syntax; Es gibt immer alle Felder für ein Modell zurück. Es ist derzeit in development und kann es in die nächste Version machen, aber für den besten Weg, um zu tun, was Sie wollen, wäre Modell Klassenmethoden zu verwenden, um benutzerdefinierte Finder zu machen. Zum Beispiel könnte User.findUser(criteria, cb) ein Benutzer finden criteria geben, und dann prüfen, ob es der angemeldete Benutzer war, bevor in dem Rückruf, die Daten zurückgeben zu entscheiden.

11

Dies ist ein Update auf die Frage, länger in Segel verwendet wird, keine Felder 11, verwenden Sie bitte statt Felder aus.

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