gpt4 book ai didi

如果没有文档,MongoDB 聚合返回计数为 0

转载 作者:行者123 更新时间:2023-12-04 13:03:00 24 4
gpt4 key购买 nike

我有一个 MongoDB 查询,它根据日期按 5 分钟窗口分组并返回计数(这是使用 count: { $sum: 1 } 在该 5 分钟窗口中的文档总数)。

如果该组中不存在文档,我希望查询也为特定的 5 分钟窗口返回 0 计数。但是目前,看起来只返回具有正计数的组。

当前查询:

        const cursor = await collection.aggregate([
{ $sort : { time : 1 } },
{
$match: {
$and: [
{selector: string },
{time: {$gte: timestamp }}
]
}
},
{
$group: {
_id: {
$subtract: [
{ $subtract: [ "$time", 0 ] },
{ $mod: [
{ $subtract: [ "$time", 0 ] },
1000 * 60 * 5
]}
],
},
count: { $sum: 1 }
}
}
])

预期响应:包含文档计数的时间戳,包括总和 0
{ _id: 1525162000000, count: 314 }
{ _id: 1523144100000, count: 0 }
{ _id: 1512155500000, count: 54 }

提前致谢!

最佳答案

免责声明:我不建议在服务器端(所以在 MongoDB 内部)这样做,而是在客户端处理这种情况。

也就是说,这是您问题的通用解决方案,它应该很容易适应您的特定情况。

想象一下,您有以下文档(或示例中聚合管道的输出):

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

以下管道将创建空桶(因此,对于 category 字段中的值范围中缺少的“间隙”值,计数为 0 的文档 - 在本例中为数字 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
}

关于如果没有文档,MongoDB 聚合返回计数为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50243295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com