【问题标题】:I need to count how many children orgs are assigned to a parent org in MongoDB我需要计算有多少子组织分配给 MongoDB 中的父组织
【发布时间】:2023-03-03 14:36:01
【问题描述】:

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

我觉得这比我目前有限的知识所能获得的要复杂一些。我在此查询中遗漏了哪些详细信息?

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      相关资源
      最近更新 更多