sql >> Databáze >  >> NoSQL >> MongoDB

Je možné získat jeden souhrnný výsledek?

Ano, je to možné. Stačí přidat $group fázi s _id rovno null . Tím se spočítají akumulované hodnoty pro všechny vstupní dokumenty jako celek. Např.

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

Nebo pokud chcete získat pouze jeden dokument z agregovaných výsledků, můžete použít $limit :

{ $limit: 1 }

AKTUALIZACE:Obě tato řešení vrací kurzor který by měl jeden dokument. Ale nemyslete na findOne jako něco speciálního. Také načte kurzor a pouze získá první dokument (pokud existuje). Zde je mongo shell implementace 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 vidíte, interně používá find . Pokud tedy chcete získat jeden dokument místo kurzoru s jedním dokumentem, můžete si napsat vlastní funkci, která dělá to samé s aggregate . Např.

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

Použití:

> db.collection.aggregateOne(...)


  1. Začínáme s MongoDB a Mongoose

  2. Jarní datové transakce MongoDB

  3. Upgrade starší mongo databáze po neúmyslném upgradu mongo verze

  4. Jak načíst hodnotu z mongoDB podle názvu klíče?