sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Es posible obtener un solo resultado en conjunto?

Sí, es posible. Solo agrega un $group escenario con _id igual a null . Eso calculará los valores acumulados para todos los documentos de entrada como un todo. Por ejemplo

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

O si desea obtener solo un documento de los resultados agregados, puede usar $limit :

{ $limit: 1 }

ACTUALIZACIÓN:Ambas soluciones devuelven cursor que tendría documento único. Pero no pienses en findOne como algo especial. También recupera el cursor y solo obtiene el primer documento (si lo hay). Aquí está la implementación de 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 puede ver, internamente usa find . Entonces, si desea obtener un solo documento en lugar de un cursor con un solo documento, puede escribir su propia función que hace lo mismo con aggregate . Por ejemplo

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

Uso:

> db.collection.aggregateOne(...)