MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

È possibile ottenere un singolo risultato in aggregato?

Sì, è possibile. Basta aggiungere un $group fase con _id uguale a null . Ciò calcolerà i valori accumulati per tutti i documenti di input nel loro insieme. Es.

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

Oppure, se desideri ottenere un solo documento dai risultati aggregati, puoi utilizzare $limit :

{ $limit: 1 }

AGGIORNAMENTO:entrambe queste soluzioni restituiscono cursore che avrebbe un unico documento. Ma non pensare a findOne come qualcosa di speciale. Recupera anche il cursore e ottiene solo il primo documento (se presente). Ecco l'implementazione della shell mongo di 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;
}

Come puoi vedere, internamente utilizza find . Quindi, se vuoi ottenere un singolo documento invece del cursore con un singolo documento, puoi scrivere la tua funzione che fa lo stesso con aggregate . Es.

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

Utilizzo:

> db.collection.aggregateOne(...)