我是MongoDB世界的新手。我正在试图弄清楚如何计算分配给父组织的子组织数量。我有一些具有这种一般结构的文件:
{
"_id" : "001",
"parentOrganization" : {
"organizationId" : "pOrg1"
},
"childOrganization" : {
"organizationId" : "cOrg1"
}
},
{
"_id" : "002",
"parentOrganization" : {
"organizationId" : "pOrg1"
},
"childOrganization" : {
"organizationId" : "cOrg2"
}
},
{
"_id" : "003",
"parentOrganization" : {
"organizationId" : "pOrg2"
},
"childOrganization" : {
"organizationId" : "cOrg3"
}
}
每个文档都有一个parentOrganization,其中包含一个关联的childOrganization。可能存在具有相同parentOrganization但具有不同childOrganizations的多个文档。可能还有多个具有相同父/子关系的文档。此外,甚至可能存在儿童组织可能与多个父组织相关联的情况。
我正在尝试按parentOrganization进行分组,然后计算与每个parentOrganization关联的唯一childOrganization的数量,并显示唯一的ID。
我尝试过使用$ match和$ group的聚合框架,但我还没有进入子组织部分来计算它们。以下是我目前正在尝试的内容:
var s1 = {$ match:{“parentOrganization.organizationId”:{$ exists:true}}};
var s2 = {$ group:{_ id:“$ parentOrganization.organizationId”,count:{$ sum:“$ childOrganization.organizationId”}}};
db.collection.aggregate(s1,s2);
我的结果是返回parentOrganization,但我的$ sum没有返回关联的childOrganizations的数量:
/ * 1 * / { “_id”:“pOrg1”, “数”:0 }
/ * 2 * / { “_id”:“pOrg2”, “数”:0 }
我觉得它比我现在有限的知识有点复杂。我在这个查询中遗漏了哪些细节?
答案 0 :(得分:0)
您的$sum
引用了childOrganization.organizationId
值,这是一个字符串。当$sum
引用字符串时,它将返回值0。
我不确定你究竟要求什么,但我相信这些汇总可以帮助你。
这将按parentOrganization.organizationId
db.collection.aggregate({$group: {"_id":"$parentOrganization.organizationId", "count": {"$sum": 1}}})
输出:
{ "_id" : "pOrg2", "count" : 1 }
{ "_id" : "pOrg1", "count" : 2 }
这将返回唯一的父/子组织计数:
db.collection.aggregate(
{$group: {"_id": {"parentOrganization": "$parentOrganization.organizationId", "childOrganization": "$childOrganization.organizationId"}, "count":{$sum:1}}})
输出:
{ "_id" : { "parentOrganization" : "pOrg2", "childOrganization" : "cOrg3" }, "count" : 1 }
{ "_id" : { "parentOrganization" : "pOrg1", "childOrganization" : "cOrg2" }, "count" : 1 }
{ "_id" : { "parentOrganization" : "pOrg1", "childOrganization" : "cOrg1" }, "count" : 1 }
这将返回一组独特的子组织,并使用$addToSet
获取一组独特的子组织。使用$addToSet
的一个警告是MongoDB 16MB的文档大小限制仍然存在。这意味着如果您的集合足够大,使得集合的大小将使一个文档大于16MB,则该命令将失败。第一个$group
将创建一组按父组织分组的子组织。 $project
仅用于将集合的总大小添加到结果中。
db.collection.aggregate([
{$group: {"_id" : "$parentOrganization.organizationId", "childOrgs" : { "$addToSet" : "$childOrganization.organizationId"}}},
{$project: {"_id" : "$_id", "uniqueChildOrgsCount": {"$size" : "$childOrgs"}, "uniqueChildOrgs": "$childOrgs"}}])
输出:
{ "_id" : "pOrg2", "uniqueChildOrgsCount" : 1, "uniqueChildOrgs" : [ "cOrg3" ]}
{ "_id" : "pOrg1", "uniqueChildOrgsCount" : 2, "uniqueChildOrgs" : [ "cOrg2", "cOrg1" ]}
在这些聚合过程中,为了简单起见,我省略了您所包含的$match
语句,但您也可以将其添加回来。