2012-02-10 19 views
2

次の3つの文書がある場合。少なくとも2つの紫色の四角形を持つ文書を選択するにはどうすればよいですか。この場合、それは最後の要素にすぎません。配列内の一致するオブジェクトの数に基づいてMongoDbの文書を見つける方法

私はdb.foo.find({foo: {"$elemMatch": {shape: "square", color: "purple"}}})

で任意の紫色の正方形を持つ文書を選択することができます知っている。しかし、それは特定の回数と一致しなければなりませんと言うする方法はありますか?

// Document 1 
{ "foo" : [ 
     { 
     "shape" : "square", 
     "color" : "purple", 
     "thick" : false 
     }, 
     { 
     "shape" : "circle", 
     "color" : "red", 
     "thick" : true 
     } 
] } 


// Document 2 
{ "foo" : [ 
     { 
     "shape" : "square", 
     "color" : "red", 
     "thick" : true 
     }, 
     { 
     "shape" : "circle", 
     "color" : "purple", 
     "thick" : false 
     } 
] } 

// Document 3 
{ "foo" : [ 
     { 
     "shape" : "square", 
     "color" : "purple", 
     "thick" : false 
     }, 
     { 
     "shape" : "square", 
     "color" : "purple", 
     "thick" : true 
     } 
] } 

この例では、ここで最後のサンプルから構成されている:http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

答えて

1

を経由してこれはMapReduceの、どこ$を使用することによって達成することができる、またはあなたのアプリケーションが面白いオブジェクトのカウントを増やすことができ挿入/更新されると(例えば、db.foo.insert({foo:[{...}, {...}, ...], purpleSquareCount:2});)。

hasPurpleSquares = function() { 
    var count = 0; 
    this.foo.forEach(function (obj) { 
     if (obj.shape == "square" && obj.color == "purple") { 
       count = count + 1; 
     } 
    }); 
    if (count >= 2) { 
     return true; 
    } 
} 

db.foo.find({$where:hasPurpleSquares}); 

最も簡単な解決策は、(パフォーマンスへの影響に注意してください)$whereを使用する可能性があります

関連する問題