2016-03-31 8 views
1

サブドメインのクエリで少し失われています。複数の一致するサブ文書を含む文書を検索

私がコレクションを照会し、名前を「gadget1」とガジェットが含まれており、それはコンポーネントの配列内の名前を持つ文書が含まれているすべてのものを取得したい
{ 
name: "thing1", 
gadgets: 
[ 
{ 
    name: "gadget1", 
    components: [ 
     { 
      name: "component1" 
      properties: 
       [ 
        {id: "I1", value: "V1"}, {id: "I2", value: "V2"}, 
        {id: "I3", value: "V3"}, {id: "I4", value: "V2"},... 
       ] 
     }, 
     { 
      name: "component2" 
      properties: 
       [ 
        {id: "I1", value: "V1"}, {id: "I2", value: "V4"}, 
        {id: "I3", value: "V3"}, {id: "I4", value: "V5"},... 
       ] 
     } 
    ] 
}, 
{ 
    name: "gadget2", 
    components: [ 
     { 
      name: "component1" 
      properties: 
       [ 
        {id: "I1", value: "V1"}, {id: "I2", value: "V3"}, 
        {id: "I3", value: "V3"}, {id: "I4", value: "V2"},... 
       ] 
     }, 
     { 
      name: "component2" 
      properties: 
       [ 
        {id: "I1", value: "V1"}, {id: "I2", value: "V7"}, 
        {id: "I3", value: "V1"}, {id: "I4", value: "V2"},... 
       ] 
     } 
    ] 
} 
] 
} 

「コンポーネント1:

は、物事の次のコレクションを考えてみましょう」、 『もプロパティ列両方のドキュメントで 含まれている必要がありますコンポーネント1』 -subdocumnent:

{id: "I1", value: "V1"} and {id: "I2", value: "V2"}. 

は、このクエリで可能ですか?

私は次のクエリを試してみました:

{ "$and": [{"gadgets.name": "gadget1"}{"gadgets.properties.id": "I1", "gadgets.properties.value": "V1"},{"gadgets.properties.id": "I2", "gadgets.properties.value": "V2"}]} 

しかし、誰成功を収めました。

答えて

1

ここにはいくつかのことがあります。これは実際には$andの場合であり、多くの場合は必要ありませんが、同じオブジェクトパスに複数の条件が必要な場合には必要です。文書は、実際の条件の両方のセットに一致する"components.properties"で「両方」配列要素を持っているところを教えてくれます

db.collection.find({ 
    "$and": [ 
    { 
     "components.properties": { 
     "$elemMatch": { 
      "id": "I1", "value": "V1" 
     } 
     }   
    }, 
    { 
     "components.properties": { 
     "$elemMatch": { 
      "id": "I2", "value": "V2" 
     } 
     }   
    } 
    ] 
}) 

:そしてまた、あなたが$elemMatchを必要とする、アレイサブ文書の複数のプロパティを一致させます。

db.collection.find({ 
    "components.properties": { 
     "$all": [ 
      { "$elemMatch": { 
       "id": "I1", "value": "V1" 
      }}, 
      { "$elemMatch": { 
       "id": "I2", "value": "V2" 
      }} 
     ] 
    } 
}) 

をそして、それは非常にきれいで読みやすい形式です:それ以上考える


、あなたが実際に$elemMatchとの組み合わせで、ここ$allを使用することができます。 $allは基本的には$andの別の形式で、この特定の形式に適用される同じキーの条件を指定することができます。

関連する問題