gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:23:25 25 4
gpt4 key购买 nike

我有以下按日期和结果分组并给出计数的 MongoDB 查询。我希望查询还返回特定日期的计数 0,如果当天不存在数据,则返回结果。

例如,我有以下结果状态:SUCCESS 和 FAILED。如果在 21 日没有 FAILED 的结果,我希望返回的计数为 0:

{
"_id" : {
"month" : 1,
"day" : 21,
"year" : 2014,
"buildResult" : "FAILURE"
},
"count" : 0
}

我已经对关系数据库和日历表做了类似的事情,但我不确定如何使用 MongoDB 来解决这个问题。这是可能的还是我应该在运行查询后以编程方式做一些事情?

以下是数据库中的文档(简化)示例:

    {
"_id" : ObjectId("52deab2fe4b0a491abb54108"),
"type" : "build",
"time" : ISODate("2014-01-21T17:15:27.471Z"),
"data" : {
"buildNumber" : 43,
"buildDuration" : 997308,
"buildResult" : "SUCCESS"
}
}

这是我当前的查询:

db.builds.aggregate([
{ $match: { "data.buildResult" : { $ne : null} }},
{ $group: {
_id: {
month: { $month: "$time" },
day: { $dayOfMonth: "$time" },
year: { $year: "$time" },
buildResult: "$data.buildResult",
},
count: { $sum: 1}
} },

{ $sort: { "_id.year": 1, "_id.month": 1, "_id.day": 1} }
])

最佳答案

如果我正确理解你想要什么,你可以试试这个:

db.builds.aggregate([
{ $project:
{
time: 1,
projectedData: { $ifNull: ['$data.buildResult', 'none'] }
}
},

{ $group: {
_id: {
month: { $month: "$time" },
day: { $dayOfMonth: "$time" },
year: { $year: "$time" },
buildResult: "$projectedData"
},
count: { $sum: { $cond: [ { $eq: [ "$projectedData", "none" ] }, 0, 1 ] } }
} },

{ $sort: { "_id.year": 1, "_id.month": 1, "_id.day": 1 } }
])

更新:
您想从输出中获得更多输入中的文档,只能使用与数组一起使用的 unwind 运算符,但您没有任何数组,所以据我所知,不可能获得更多你的情况下的文件。所以你应该在查询结果之后添加一些逻辑,为现有日期创建新数据,为另一种类型的 buildResult 创建计数为 0 ...

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

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