2017-12-15 21 views
1

そんなに類似ドキュメントのコレクション有する複数の条件に一致する:集約文書は

{ 
    "_id": ObjectId("xxxxx"), 
    "item": [ 
     { "property": ["attr1", "+1"] }, 
     { "property": ["attr2", "-1"] } 
    ] 
} 

{ 
    "_id": ObjectId("xxxxy"), 
    "item": [ 
     { "property": ["attr1", "-1"] }, 
     { "property": ["attr2", "0"] } 
    ] 
} 

{ 
    "_id": ObjectId("xxxxz"), 
    "item": [ 
     { "property": ["attr1", "0"] }, 
     { "property": ["attr2", "+1"] } 
    ] 
} 

好ましくアグリゲーションパイプラインを使用して、文書と一致する任意の方法が存在する場合にのみあればプロパティの1つがと一致する場合、の状態になりますか?

例えば、私は、アレイ内の1つの目的は、これらの条件の両方に一致するクエリとします、それは「ATTR1」と+」で始まる要素を含む単一のプロパティです

("item.property": "attr1") AND ("item.property": /^\+/) 

を"しかし

、次のようになります私の現在のクエリ使用:両方が「ATTR1」と「+」と統計要素とプロパティが含まれているので、これは両方の最初と最後の文書にマッチする

collection.aggregate(
    { $match: 
     { $and: 
      [ 
       { "item.property": "attr1" }, 
       { "item.property": /^\+/ } 
      ] 
     } 
    } 

を。しかし、 "+"で始まる要素は配列内の同じオブジェクトに属していないため、このクエリを最後の文書に一致させたくありません。

アグリゲーションフレームワークを使用してこの動作を達成する方法はありますか?

答えて

0

$elemMatchで以下のクエリを使用して、配列の両方の値と一致させることができます。あなたは配列のインデックスを参照するようにしたくない場合は

また

db.collection_name.aggregate({ 
    "$match": { 
    "item": { 
     "$elemMatch": { 
     "property.0": "attr1", 
     "property.1": /^\+/ 
     } 
    } 
    } 
}); 

ような何か、あなたは$all演算子を使用することができます。

db.collection_name.aggregate({ 
    "$match": { 
    "item": { 
     "$elemMatch": { 
     "property": { 
      "$all": [ 
      "attr1", 
      /^\+/ 
      ] 
     } 
     } 
    } 
    } 
});