MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

É possível obter um único resultado agregado?


Sim, é possível. Basta adicionar um $group estágio com _id igual a null . Isso calculará os valores acumulados para todos os documentos de entrada como um todo. Por exemplo.
{ $group: { _id: null, total: { $sum: "$price" }}}

Ou se você deseja obter apenas um documento dos resultados agregados, pode usar $limit :
{ $limit: 1 }

ATUALIZAÇÃO:Ambas as soluções retornam cursor que teria documento único. Mas não pense em findOne como algo especial. Ele também recupera o cursor e apenas obtém o primeiro documento (se houver). Aqui está a implementação do shell mongo de 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;
}

Como você pode ver, ele usa internamente find . Portanto, se você deseja obter um único documento em vez de um cursor com um único documento, pode escrever sua própria função que faz o mesmo com aggregate . Por exemplo.
> DBCollection.prototype.aggregateOne = function(pipeline) {
     var cur = this.aggregate(pipeline);
     if (!cur.hasNext())
         return null; 
     return cur.next(); 
 }

Uso:
> db.collection.aggregateOne(...)