gpt4 book ai didi

mongodb - 如何在分组时使用 $cond 检查同一数组中的空值进行聚合操作

转载 作者:可可西里 更新时间:2023-11-01 09:34:12 26 4
gpt4 key购买 nike

这是我的文档,

{
"_id": "58aecaa3758fbff4176db088",
"actualEndDate": "2017-02-27T00:00:00.000Z",
"Details": [
{
"projectId": "58a585f6758fbff4176dadb9",
}
]
},
{
"_id": "58aecac8758fbff4176db08b",
"actualEndDate": "2017-03-12T00:00:00.000Z",
"Details": [
{
"projectId": "58a585f6758fbff4176dadb9",
}
]
},
{
"_id": "58aecac8758fbff4176db08c",
"actualEndDate": null,
"Details": [
{
"projectId": "58a585f6758fbff4176dadb9",
}
]
}

我需要对这些进行分组,在我的查询中,我需要找到“actualEndDate”的 $max,只有当所有“actualEndDate”字段都不为空时才有条件。

我试过这样的,

{ 
$group:
{
_id: '$Details.projectId',
actualEndDate:
{
$cond: {
if: { $ne: [ $actualEndDate, null] },
then: $actualEndDate, else: null
}
}
}
}

这样我就可以得到像这样的预期结果

{
"projectId": "58a585f6758fbff4176dadb9",
"actualEndDate": null,
}

如果示例不包含 { "_id": "58aecac8758fbff4176db08c"} 记录,那么我希望结果具有 actualEndDate 作为其他两个文档的最大值

{
"projectId": "58a585f6758fbff4176dadb9",
"actualEndDate": "2017-03-12T00:00:00.000Z",
}

感谢任何帮助。

最佳答案

您可以 $sort您的 actualDate 字段,$unwind你的 Details 数组然后 $group 只取 $first date 将确保这是最近的日期:

db.data.aggregate([{
$sort: {
"actualEndDate": -1
}
}, {
$unwind: "$Details"
}, {
$group: {
_id: "$Details.projectId",
actualEndDate: {
$first: "$actualEndDate"
}
}
}]);

如果指定的 projectId 的至少一个日期为 null,如果您想返回一个 null date,则以下操作将完成这项工作:

db.data.aggregate([{
$sort: {
"actualEndDate": -1
}
}, {
$unwind: "$Details"
}, {
$group: {
_id: "$Details.projectId",
dates: {
$push: "$actualEndDate"
}
}
}, {
$project: {
projectId: "$_id",
actualEndDate: {
$cond: {
if: {
$setIsSubset: [
[null], "$dates"
]
},
then: null,
else: { $arrayElemAt: ["$dates", 0] }
}
}
}
}]);

思路是$push将所有日期放入一个新数组中,并进行投影以在数组中发现 null 时返回 null,否则返回数组的第一个元素(值在第一阶段)

关于mongodb - 如何在分组时使用 $cond 检查同一数组中的空值进行聚合操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43361587/

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