2017-04-12 4 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" 
    } 
:私はこの一般的な構造を有する文書を有します

各ドキュメントには、関連付けられたchildOrganizationを持つparentOrganizationがあります。 parentOrganizationは同じですが、異なるchildOrganizationsを持つ複数のドキュメントが存在することがあります。また、同じ親子関係を持つ複数の文書が存在することもあります。さらに、子組織が複数の親組織に関連する場合もあります。

私はparentOrganizationでグループ化し、各parentOrganizationに関連付けられた一意のchildOrganizationの数を数え、ユニークなIDを表示しようとしています。

私は$ matchと$ groupで集計フレームワークを使用しようとしましたが、私は子組織の部分に数えられません。私が現在試みていることは次のとおりです。

var s1 = {$ parent:{{parentOrganization.organizationId ":{$ exists:true}}};

var s2 = {$ group:{$ id: "$ parentOrganization.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}}}) 

出力によって文書群の数を返します。

db.collection.aggregate(
    {$group: {"_id": {"parentOrganization": "$parentOrganization.organizationId", "childOrganization": "$childOrganization.organizationId"}, "count":{$sum:1}}}) 

{ "_id" : "pOrg2", "count" : 1 } 
{ "_id" : "pOrg1", "count" : 2 } 

これはユニークな親/子組織の数を返します。出力:

{ "_id" : { "parentOrganization" : "pOrg2", "childOrganization" : "cOrg3" }, "count" : 1 } 
{ "_id" : { "parentOrganization" : "pOrg1", "childOrganization" : "cOrg2" }, "count" : 1 } 
{ "_id" : { "parentOrganization" : "pOrg1", "childOrganization" : "cOrg1" }, "count" : 1 } 

これにより、固有の子組織の数が返され、$addToSetを使用して固有の子組織も取得されます。 $addToSetを使用する際の注意点の1つは、文書サイズに対するMongoDB 16MBの制限がまだ保持されていることです。つまり、セットのサイズが1つのドキュメントを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の文を残していますが、同様にそのバック追加することができます。

関連する問題