mongodb:如果字段不为null,则分组依据和计数,否则显示为零



我在mongodb中有数千个文档,我必须按groupId对它们进行分组,如果groupId存在且不为空,则对它们进行计数。如果该字段的值为null,则结果应在计数中显示0。以下是的示例文档

{
"_id": ObjectId("5e706eb075658f3af3a61694"),
"name": "child doc 1",
"email": "abcd@yopmail.com",
"groupId": ObjectId("5e70708775658f3af3a61695"),
"createdAt": ISODate("2020-03-17T12:01:12.525+05:30"),
"updatedAt": ISODate("2020-03-17T12:01:12.525+05:30"),
"__v": 0
},
{
"_id": ObjectId("5e706eb075658f3af3a61694"),
"name": "child doc 2",
"email": "abcd@yopmail.com",
"groupId": ObjectId("5e70708775658f3af3a61695"),
"createdAt": ISODate("2020-03-17T12:01:12.525+05:30"),
"updatedAt": ISODate("2020-03-17T12:01:12.525+05:30"),
"__v": 0
},
{
"_id": ObjectId("5e706eb075658f3af3a61694"),
"name": "child doc 3",
"email": "abcd@yopmail.com",
"groupId": ObjectId("5e70708775658f3af3a61695"),
"createdAt": ISODate("2020-03-17T12:01:12.525+05:30"),
"updatedAt": ISODate("2020-03-17T12:01:12.525+05:30"),
"__v": 0,
},
{
"_id": ObjectId("5e70708775658f3af3a61695"),
"name": "parent doc",
"email": "abcd@yopmail.com",
"groupId": null,
"createdAt": ISODate("2020-03-17T12:01:12.525+05:30"),
"updatedAt": ISODate("2020-03-17T12:01:12.525+05:30"),
"__v": 0
}

对于groupId不为null的文档,即子文档,count应该为0。此外,结果不应包含groupId不为null的文档。结果应该是

{
"_id": ObjectId("5e70708775658f3af3a61695"),
"name": "parent doc",
"email": "abcd@yopmail.com",
"groupId": null,
"createdAt": ISODate("2020-03-17T12:01:12.525+05:30"),
"updatedAt": ISODate("2020-03-17T12:01:12.525+05:30"),
"count": 3,
"__v": 0
}

我该怎么做?

当groupId为null时,您可以为其设置一个默认值,该默认值不得与具有null groupId的其他元素相同。您可以使用$ifNull执行此操作https://docs.mongodb.com/manual/reference/operator/aggregation/ifNull/

并在groupId中设置一些类似文档id的内容。之后,可以对元素进行分组。如果groupId与id相同,则可以将计数设置为零。

最新更新