MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Ist es möglich, ein einzelnes Ergebnis aggregiert zu erhalten?

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

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

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

{ $limit: 1 }

UPDATE:Beide Lösungen geben cursor zurück was ein einziges Dokument haben würde. 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 die Mongo-Shell-Implementierung von 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, verwendet es intern find . Wenn Sie also ein einzelnes Dokument anstelle eines Cursors 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(); 
 }

Verwendung:

> db.collection.aggregateOne(...)