sql >> Database >  >> NoSQL >> MongoDB

Is het mogelijk om één resultaat in totaal te krijgen?

Ja, het is mogelijk. Voeg gewoon een $group toe podium met _id gelijk aan null . Dat berekent de geaccumuleerde waarden voor alle invoerdocumenten als geheel. Bijv.

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

Of als u slechts één document wilt krijgen van geaggregeerde resultaten, kunt u $limit . gebruiken :

{ $limit: 1 }

UPDATE:Beide oplossingen retourneren cursor die één document zou hebben. Maar denk niet aan findOne als iets bijzonders. Het haalt ook de cursor op en krijgt alleen het eerste document (indien aanwezig). Hier is mongo shell-implementatie van 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;
}

Zoals je kunt zien, gebruikt het intern find . Dus als u een enkel document wilt krijgen in plaats van een cursor met een enkel document, kunt u uw eigen functie schrijven die hetzelfde doet met aggregate . Bijv.

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

Gebruik:

> db.collection.aggregateOne(...)


  1. Redis Out of Memory Exceptions, maar heb nog steeds voldoende geheugen

  2. mongodb zoeken door meerdere array-items

  3. E-mailindexering met Cloudera Search en HBase

  4. Rails Redis instelling maxmemory en maxmemory-policy