MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB сборен брой връщания от 0, ако няма документи

Отказ от отговорност:Не препоръчвам да правите това от страна на сървъра (така че вътре в MongoDB), а по-скоро да се справите с този случай от страна на клиента.

Въпреки това, ето общо решение на вашия проблем, което трябва лесно да се адаптира към вашия конкретен случай.

Представете си, че имате следните документи (или изход от тръбопровод за агрегиране, както във вашия пример):

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

Следният конвейер ще създаде празни кофи (така че документи с брой 0 за стойностите на „пропуск“, които липсват от диапазона от стойности в category поле - в този случай числото 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
                ]
            }
        }
    }
})

Резултатът от горната заявка ще бъде:

{
    "_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. Mongo:обобщени $geoNear и $text няма резултати

  2. Най-добрата практика на MongoDB за препращане

  3. Как да използвам pymongo за свързване към съществуваща колекция от документи/db?

  4. MongoDB PHP:Как да получа ObjectId с JSON канал? (празно е)

  5. Вземете филтриран брой елементи в масива от $lookup заедно с целия документ