MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Възможно ли е да се получи единичен резултат в съвкупност?

Да, възможно е. Просто добавете $group етап с _id равно на null . Това ще изчисли натрупаните стойности за всички входни документи като цяло. Напр.

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

Или ако искате да получите само един документ от обобщени резултати, можете да използвате $limit :

{ $limit: 1 }

АКТУАЛИЗАЦИЯ:И двете решения връщат курсор което би имало единичен документ. Но не мислете за findOne като нещо специално. Той също така извлича курсора и просто получава първия документ (ако има такъв). Ето реализация на mongo shell на 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;
}

Както можете да видите, той вътрешно използва find . Така че, ако искате да получите един документ вместо курсор с един документ, можете да напишете своя собствена функция, която прави същото с aggregate . Напр.

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

Употреба:

> db.collection.aggregateOne(...)


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да върна ISO формат на дата в PHP за MongoDB?

  2. Разлика между Find и FindAsync

  3. Обект на MongoDB, сериализиран като JSON

  4. Вземете брой на общите документи с MongoDB, когато използвате лимит

  5. MongoDB – ограничаване на резултатите от заявка