2016-09-07 14 views
0

私はすべてのレコードを取得しようとしています(とすべてのレコードの数)は以下のような構造のため、モンゴDB - セカンドレベルの検索 - elemMatch

{ 
    id: 1, 
    level1: { 
    level2: 
     [ 
     { 
      field1:value1; 
     }, 
     { 
      field1:value1; 
     }, 
     ] 
    } 
}, 
{ 
     id: 2, 
     level1: { 
     level2: 
      [ 
      { 
       field1:null; 
      }, 
      { 
       field1:value1; 
      }, 
      ] 
     } 
    } 

私の要件は、持っているレコードの数を取得することですフィールド1に値を入力します(レベル2では少なくとも1つ)。私はすべてのidsまたはそのようなIDの数を取得すると言う必要があります。

私が使用しているクエリがある

db.table.find({}, 
    { 
     _id = id, 
     value: { 
      $elemMatch: {'level1.level2.field1':{$exists: true}} 
     } 
    } 
}) 

示唆してください。

EDIT1: これは私がコメントで尋ねようとした質問です。私はコメントで正しく解明することができませんでした。したがって、質問を編集する。

{ 
    id: 1, 
    level1: { 
    level2: 
     [ 
     { 
      field1:value1; 
     }, 
     { 
      field1:value1; 
     }, 
     ] 
    } 
}, 
{ 
     id: 2, 
     level1: { 
     level2: 
      [ 
      { 
       field1:value2; 
      }, 
      { 
       field1:value2; 
      }, 
      { 
       field1:value2; 
      } 
      ] 
     } 
    } 
    { 
     id: 3, 
     level1: { 
     level2: 
      [ 
      { 
       field1:value1; 
      }, 
      { 
       field1:value1; 
      }, 
      ] 
     } 
    } 

私たちは、私はあなたが以下の検索クエリであることを行うことができます

value1: 2 // Once each for documents 1 & 3 
value2: 1 // Once for document 2 

答えて

0

ような何かをしたい

value1: 4 
value2: 3 

で結果を使用したクエリ:

db.table.find({ "level1.level2" : { $elemMatch: { field1 : {$exists: true} } } }, {}) 

この意志フィールド1を持つすべてのドキュメントを返します。 "level1.level2"構造体にあります。コメントでのご質問については

、あなたは「私はフィールド1の値のためにグループ化(および対応するカウントを)返すために持っていた」には、以下の集約を使用することができます。

db.table.aggregate(
    [ 
    { 
     $unwind: "$level1.level2" 
    }, 
    { 
     $match: { "level1.level2.field1" : { $exists: true } } 
    }, 
    { 
     $group: { 
     _id : "$level1.level2.field1", 
     count : {$sum : 1} 
     } 
    } 
    ] 

UPDATE:あなたの質問のために"'value1 - 2` level2では、ドキュメントの場合、field1のすべての値が同じであると仮定します。"

db.table.aggregate(
    [ 
    { 
     $unwind: "$level1.level2" 
    }, 
    { 
     $match: { 
     "level1.level2.field1" : { $exists: true } 
     } 
    }, 
    { 
     $group: { 
      _id : { id : "$_id", field1: "$level1.level2.field1" }, 
      count : {$sum : 1} 
      } 
    } 
    ] 
); 

アップデート2:私は、私が代わりにのみ、フィールド1の値にグループ化する、正しくあなたの質問を理解してほしい は、私は、エクストラグループとして文書の_idを追加 私は、凝集を変更し、余分なグループ分けを追加しました以下の集計はあなたが望む結果を提供します。

db.table.aggregate(
    [ 
    { 
     $unwind: "$level1.level2" 
    }, 
    { 
     $match: { 
       "level1.level2.field1" : { $exists: true } 
      } 
    }, 
    { 
     $group: { 
        _id : { id : "$_id", field1: "$level1.level2.field1" } 
        } 
    }, 
    { 
     $group: { 
        _id : { id : "$_id.field1"}, 
        count : { $sum : 1} 
        } 
    } 
    ] 
); 
+0

ありがとうございます。フィールド1の値のグループ化(および対応するカウント)を返さなければならないかどうか、私はそれをどのように変更するのだろうかと思いましたか? –

+0

私の更新された回答を参照してください – HoefMeistert

+0

私は私の質問で明確でない場合は申し訳ありません。 'をvalue1 - - このクエリは、出力として、以下を返します3' 私が探している何かのように、 「VALUE1です - LEVEL2で2' 、文書のため、すべての値がされると仮定フィールド1と同じです。しかし、それは1つの項目としてカウントされるべきです(同じ文書内のfield1に複数のループがありますが) –