MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Czy można uzyskać pojedynczy wynik w sumie?

Tak to mozliwe. Po prostu dodaj $group etap z _id równe null . Spowoduje to obliczenie skumulowanych wartości dla wszystkich dokumentów wejściowych jako całości. Np.

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

Lub jeśli chcesz uzyskać tylko jeden dokument z zagregowanych wyników, możesz użyć $limit :

{ $limit: 1 }

AKTUALIZACJA:oba te rozwiązania zwracają kursor który miałby jeden dokument. Ale nie myśl o findOne jako coś wyjątkowego. Pobiera również kursor i po prostu pobiera pierwszy dokument (jeśli istnieje). Oto implementacja powłoki mongo 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;
}

Jak widać, wewnętrznie używa find . Tak więc, jeśli chcesz uzyskać pojedynczy dokument zamiast kursora z pojedynczym dokumentem, możesz napisać własną funkcję, która robi to samo z aggregate . Np.

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

Użycie:

> db.collection.aggregateOne(...)


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Zastępowanie osadzonego dokumentu w tablicy w MongoDB

  2. Jak znaleźć długość tablicy mongodb

  3. Proaktywne monitorowanie MongoDB (kąt programisty/doradców)

  4. Agregacja $ lookup z C#

  5. jak używać wypełniania i agregowania w tym samym oświadczeniu?