sql >> Database teknologi >  >> NoSQL >> MongoDB

Er det muligt at få et enkelt resultat samlet?

Ja, det er muligt. Bare tilføj en $group trin med _id lig med null . Det vil beregne akkumulerede værdier for alle inputdokumenter som helhed. F.eks.

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

Eller hvis du kun vil have ét dokument fra aggregerede resultater, kan du bruge $limit :

{ $limit: 1 }

OPDATERING:Begge disse løsninger returnerer markør som ville have et enkelt dokument. Men tænk ikke på findOne som noget særligt. Den henter også markøren og får bare det første dokument (hvis nogen). Her er mongo shell implementering af 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, bruger den internt find . Så hvis du ønsker at få et enkelt dokument i stedet for markør med et enkelt dokument, kan du skrive din egen funktion, som gør det samme med aggregate . F.eks.

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

Brug:

> db.collection.aggregateOne(...)


  1. Redis - Sorteret sæt, find vare efter egenskabsværdi

  2. MongoDB:Fatal fejl:Klasse 'MongoClient' blev ikke fundet

  3. Oprettelse af en visningsfunktion uden at returnere et svar i Flask

  4. Sådan skalerer du SignalR ved hjælp af Azure Worker Role og OWIN