我需要计算在MongoDB中为父组织分配了多少个子组织

时间:2017-04-12 15:59:26

标签: mongodb mongodb-query aggregation-framework

我是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 }

我觉得它比我现在有限的知识有点复杂。我在这个查询中遗漏了哪些细节?

1 个答案:

答案 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语句,但您也可以将其添加回来。