2014-10-15 15 views
9

Ist es möglich, ein einzelnes Dokument unter db.collection.aggregate wie in db.collection.findOne zu erhalten?Ist es möglich, ein einzelnes Ergebnis als Ganzes zu erhalten?

+1

Es ist nicht wirklich klar, was Sie hier fragen. Insbesondere sollten Sie erklären, was Sie tun möchten. Übrigens ist die bisher gegebene Antwort in den meisten Fällen falsch. –

Antwort

2

Es ist möglich, $match Bühne Aggregation Pipeline hinzuzufügen. Aber selbst wenn nur ein einziges Dokument gefunden wird, ist das Ergebnis immer noch eine Liste (in diesem Fall die Länge eins). Also die Antwort ist "NO, es ist nicht möglich".

12

Ja, es ist möglich. Fügen Sie einfach eine $group Bühne mit _id gleich null hinzu. Dadurch werden die kumulierten Werte für alle Eingabedokumente als Ganzes berechnet. Z.B.

{ $group: { _id: null, total: { $sum: "$price" }}} 

Oder wenn Sie nur ein Dokument aus aggregierten Ergebnisse erhalten möchten, können Sie $limit:

{ $limit: 1 } 

UPDATE: Beide Lösungen zurückkehren Cursor das Dokument haben. Aber denken Sie nicht an findOne als etwas besonderes. Es ruft auch den Cursor ab und erhält nur das erste Dokument (falls vorhanden). Hier ist Mongo Mantel Umsetzung findOne:

function (query , fields, options){ 
    var cursor = this.find(query, fields, -1 /* limit */, 0 /* skip*/, 
     0 /* batchSize */, options); 

    if (! cursor.hasNext()) 
     return null; 
    var ret = cursor.next(); 
    if (cursor.hasNext()) throw "findOne has more than 1 result!"; 
    if (ret.$err) 
     throw "error " + tojson(ret); 
    return ret; 
} 

Wie Sie sehen können, die es intern verwendet find. Also, wenn Sie einzelnes Dokument anstelle von Cursor mit einem einzelnen Dokument erhalten möchten, können Sie Ihre eigene Funktion schreiben, die dasselbe mit aggregate tut. Z.B.

> DBCollection.prototype.aggregateOne = function(pipeline) { 
    var cur = this.aggregate(pipeline); 
    if (!cur.hasNext()) 
     return null; 
    return cur.next(); 
} 

Verbrauch:

> db.collection.aggregateOne(...) 
+1

Leider bekomme ich immer noch ein Array mit einem Element – Erik

+0

Bullseye (y), sehr schön erklärt. –

0

ja, es ist möglich. Sie müssen mongodb $match Betrieb verwenden

ex: das ist für mich gearbeitet.

{ $lookup: { from: 'user', localField: 'userId', foreignField: 'id', as: 'publisherDetails' } }, 
{ $match: { id } } 

mondodb doc's Beispiel:

db.articles.aggregate(
[ { $match : { id : "132ada123aweae1321awew12" } }, 
    { $lookup: { from: 'user', localField: 'userId', foreignField: 'id', as: 'publisherDetails' } } ] 
); 
Verwandte Themen