2015-01-13 16 views
6

mongoDBオブジェクトのネストが多く、指定された条件に一致するサブ文書の数を数えたい編集:(各文書内)。たとえば:MongoDBネストされたオブジェクトの集計数量

{"_id":{"chr":"20","pos":"14371","ref":"A","alt":"G"}, 
"studies":[ 
    { 
     "study_id":"Study1", 
     "samples":[ 
      { 
       "sample_id":"NA00001", 
       "formatdata":[ 
        {"GT":"1|0","GQ":48,"DP":8,"HQ":[51,51]} 
       ] 
      }, 
      { 
       "sample_id":"NA00002", 
       "formatdata":[ 
        {"GT":"0|0","GQ":48,"DP":8,"HQ":[51,51]} 
       ] 
      } 
     ] 
    } 
] 
} 
{"_id":{"chr":"20","pos":"14372","ref":"T","alt":"AA"}, 
"studies":[ 
    { 
     "study_id":"Study3", 
     "samples":[ 
      { 
       "sample_id":"SAMPLE1", 
       "formatdata":[ 
        {"GT":"1|0","GQ":48,"DP":8,"HQ":[51,51]} 
       ] 
      }, 
      { 
       "sample_id":"SAMPLE2", 
       "formatdata":[ 
        {"GT":"1|0","GQ":48,"DP":8,"HQ":[51,51]} 
       ] 
      } 
     ] 
    } 
] 
} 
{"_id":{"chr":"20","pos":"14373","ref":"C","alt":"A"}, 
"studies":[ 
    { 
     "study_id":"Study3", 
     "samples":[ 
      { 
       "sample_id":"SAMPLE3", 
       "formatdata":[ 
        {"GT":"0|0","GQ":48,"DP":8,"HQ":[51,51]} 
       ] 
      }, 
      { 
       "sample_id":"SAMPLE7", 
       "formatdata":[ 
        {"GT":"0|0","GQ":48,"DP":8,"HQ":[51,51]} 
       ] 
      } 
     ] 
    } 
] 
} 

私が含まれているどのように多くのサブ文書を知りたいGT:「1 | 0」、第3回の最初の文書中の1、および第二の2、および0になり、この場合、これ。私はunwindと集約関数を試しましたが、私は明らかに何か正しいことをしていません。私は「GT」フィールドで、サブ文書をカウントしようとすると、モンゴは文句を言う:「」私のグループの名前以来

db.collection.aggregate([{$group: {"$studies.samples.formatdata.GT":1,_id:0}}]) 

を含めることはできません、まだ私はそれらを残している場合:

db.collection.aggregate([{$group: {"$GT":1,_id:0}}]) 

それ"$ GTはオペレータ名にはなれない"ため文句を言う

アイデアはありますか?

答えて

14

あなたは配列を扱うとき$unwindを処理する必要がある、とあなたはこの3回を実行する必要があります。

db.collection.aggregate([ 

    // Un-wind the array's to access filtering 
    { "$unwind": "$studies" }, 
    { "$unwind": "$studies.samples" }, 
    { "$unwind": "$studies.samples.formdata" }, 

    // Group results to obtain the matched count per key 
    { "$group": { 
     "_id": "$studies.samples.formdata.GT", 
     "count": { "$sum": 1 } 
    }} 
]) 

理想的に、あなたの入力をフィルタリングします。おそらく、$ unwindの前後で$matchが処理され、$regexを使用して、ポイントのデータが "1"で始まるドキュメントと一致する可能性があります。

db.collection.aggregate([ 

    // Match first to exclude documents where this is not present in any array member 
    { "$match": { "studies.samples.formdata.GT": /^1/ } }, 

    // Un-wind the array's to access filtering 
    { "$unwind": "$studies" }, 
    { "$unwind": "$studies.samples" }, 
    { "$unwind": "$studies.samples.formdata" }, 

    // Match to filter 
    { "$match": { "studies.samples.formdata.GT": /^1/ } }, 

    // Group results to obtain the matched count per key 
    { "$group": { 
     "_id": { 
       "_id": "$_id", 
       "key": "$studies.samples.formdata.GT" 
     }, 
     "count": { "$sum": 1 } 
    }} 
]) 

すべての場合、「ドル$」というプレフィックス付きエントリは、ドキュメントのプロパティを参照する「変数」です。これらは、右側の入力を使用するための「値」です。左側の "キー"はプレーンな文字列キーとして指定する必要があります。キーに名前を付ける変数は使用できません。

+1

はい、これは機能しますが、実際にはドキュメントの代わりにコレクション内のすべての値がカウントされます。私が探しているのは、0がある場合を含め、各文書のサブ文書を数えることに相当します。これをより明確にするためにオリジナルの投稿を編集します。 –

+0

@StevenHartそれはあなたの質問ではっきりしていませんでした。しかし、文書IDをグループ化キーに含めるのは簡単なことです。変更を参照してください。 –

+0

$ unwindsの後に2番目の$一致が必要ですか? – TheGaff

関連する問題