2017-04-12 20 views
-1

我是新來的MongoDB世界。我想弄清楚如何計算分配給上級組織的兒童組織數量。我有這個一般結構文件:我需要計算在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,但我的$總和沒有返回相關childOrganizations數量:

/* 1 */ { 「_id」: 「pOrg1」, 「計數」:0 }

/* 2 */ { 「_id」: 「pOrg2」, 「計數」: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聲明,但你可以添加回也是如此。