sql >> Databasteknik >  >> NoSQL >> MongoDB

Är det möjligt att få enstaka resultat sammanlagt?

Ja det är möjligt. Lägg bara till en $group steg med _id lika med null . Det kommer att beräkna ackumulerade värden för alla indatadokument som helhet. T.ex.

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

Eller om du bara vill få ett dokument från aggregerade resultat kan du använda $limit :

{ $limit: 1 }

UPPDATERING:Båda dessa lösningar returnerar markör som skulle ha ett enda dokument. Men tänk inte på findOne som något speciellt. Den hämtar också markören och får bara det första dokumentet (om något). Här är mongo-skalimplementeringen av 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;
}

Som du kan se använder den internt find . Så om du vill få ett enda dokument istället för markör med ett enda dokument, kan du skriva din egen funktion som gör samma sak med aggregate . T.ex.

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

Användning:

> db.collection.aggregateOne(...)


  1. Lista över MongoDB-datumoperatörer, metoder och variabler

  2. Returnera det sista sanna värdet för varje grupp

  3. När ska MongoDB-databasanslutning stängas i Nodejs

  4. Referera till andra dokument med sträng snarare än ObjectId