MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Apakah mungkin untuk mendapatkan hasil tunggal secara agregat?

Ya, itu mungkin. Cukup tambahkan $group panggung dengan _id sama dengan null . Itu akan menghitung nilai akumulasi untuk semua dokumen input secara keseluruhan. Mis.

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

Atau jika Anda ingin mendapatkan hanya satu dokumen dari hasil agregat, Anda dapat menggunakan $limit :

{ $limit: 1 }

PEMBARUAN:Kedua solusi ini mengembalikan kursor yang akan memiliki satu dokumen. Tapi jangan pikirkan findOne sebagai sesuatu yang istimewa. Itu juga mengambil kursor dan hanya mendapatkan dokumen pertama (jika ada). Ini adalah implementasi mongo shell dari 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;
}

Seperti yang Anda lihat, secara internal menggunakan find . Jadi, jika Anda ingin mendapatkan satu dokumen alih-alih kursor dengan satu dokumen, Anda dapat menulis fungsi Anda sendiri yang melakukan hal yang sama dengan aggregate . Mis.

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

Penggunaan:

> db.collection.aggregateOne(...)


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB yang Dihosting Sendiri

  2. Bagaimana cara menetapkan batas waktu pada kueri Mongoose?

  3. Agregat Mongodb:konversikan tanggal ke zona waktu lain

  4. wildcard awalan mongoDB:pencarian teks lengkap ($ teks) temukan bagian dengan string pencarian

  5. Membuat Indeks Multifield di Mongoose / MongoDB