MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Est-il possible d'obtenir un résultat unique dans l'ensemble ?

Oui c'est possible. Ajoutez simplement un $group étape avec _id égal à null . Cela calculera les valeurs cumulées pour tous les documents d'entrée dans leur ensemble. Par exemple

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

Ou si vous souhaitez obtenir un seul document à partir des résultats agrégés, vous pouvez utiliser $limit :

{ $limit: 1 }

MISE À JOUR :ces deux solutions renvoient le curseur qui aurait un document unique. Mais ne pensez pas à findOne comme quelque chose de spécial. Il récupère également le curseur et obtient simplement le premier document (le cas échéant). Voici l'implémentation mongo shell 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;
}

Comme vous pouvez le voir, il utilise en interne find . Donc, si vous voulez obtenir un seul document au lieu d'un curseur avec un seul document, vous pouvez écrire votre propre fonction qui fait la même chose avec aggregate . Par exemple

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

Utilisation :

> db.collection.aggregateOne(...)