这是我的文档,
{
"_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/