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

Jumlah pengembalian agregat MongoDB 0 jika tidak ada dokumen

Penafian:Saya tidak menyarankan melakukan ini di sisi server (jadi di dalam MongoDB) melainkan menangani kasus itu di sisi klien.

Karena itu, berikut adalah solusi umum untuk masalah Anda yang harus mudah disesuaikan dengan kasus spesifik Anda.

Bayangkan Anda memiliki dokumen berikut (atau keluaran dari pipa agregasi seperti pada contoh Anda):

{
    "category" : 1
}
{
    "category" : 1
}
// note the missing { category: 2 } document here
{
    "category" : 3
}

Pipeline berikut akan membuat bucket kosong (jadi dokumen dengan hitungan 0 untuk nilai "celah" yang hilang dari rentang nilai dalam category bidang - dalam hal ini nomor 2):

var bucketSize = 1;

db.getCollection('test').aggregate({
    $group: {
        _id: null, // throw all documents into the same bucket
        "min": { $min: "$category" }, // just to calculate the lowest
        "max": { $max: "$category" }, // and the highest "category" value 
        "docs": { $push: "$$ROOT" } // and also keep the root documents
    }
}, {
    $addFields: {
        "docs": { // modify the existing docs array - created in the previous stage
            $concatArrays: [ // by concatenating
                "$docs", // the existing docs array
                {
                    $map: { // with some other array that will be generated
                        input: {
                            $range: [ "$min", "$max", bucketSize ] // based on the min and max values and the bucket size
                        },
                        as: "this",
                        in: { // but represented not as a plain number but as a document that effectively creates a bogus document
                            "category": "$$this", // the bogus category will be set to the respective value
                            "bogus": 1 // marker that allows us not to count this document in the next stage and still get a bucket from $group
                        }
                    }
                }
            ]
        }
    }
}, {
    $unwind: "$docs" // flatten the "docs" array which will now contain the bogus documents, too
}, {
    $group: {
        _id: "$docs.category", // group by category
        "count": { // this is the result we are interested in
            $sum: { // which will be aggregated by calculating the sum for each document of
                $cond: [ // either 0 or 1 per document
                    { $eq: [ "$docs.bogus", 1 ] }, // depending on whether the document should count as a result or not
                    0,
                    1
                ]
            }
        }
    }
})

Output dari query di atas adalah:

{
    "_id" : 2,
    "count" : 0.0 // this is what we wanted to achieve
}
{
    "_id" : 3,
    "count" : 1.0 // correct number of matches
}
{
    "_id" : 1,
    "count" : 2.0 // correct number of matches
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cara menggunakan operator $in di mongodb dengan dua bidang di java

  2. Kueri MongoDB dengan grup bersyarat berdasarkan pernyataan

  3. Mongoose:Tidak dapat mengambil dokumen file dari koleksi .chunk tanpa bidang data

  4. Buat &Temukan GeoLocation di luwak

  5. Apakah pesanan penting di bson_iter_find di mongo c driver