2012-02-10 41 views
2

如果我有以下3個文檔。我如何選擇至少有兩個紫色正方形的文檔。在這種情況下,它只是最後一個元素。如何根據數組中匹配對象的數量在MongoDb中查找文檔

我知道我可以與任何紫色的正方形與db.foo.find({foo: {"$elemMatch": {shape: "square", color: "purple"}}})

選擇文件但是,有沒有辦法可以說必須在一定的次數相匹配? http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

回答

1

這可以通過使用$其中,MapReduce的,或者您的應用程序可能會增加有趣的東西計數來完成:

// 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 
     } 
] } 

這個例子從最後一個樣本在這裏適應當插入/更新時(例如db.foo.insert({foo:[{...}, {...}, ...], purpleSquareCount:2});)。

最簡單的解決方案是可能使用$where(注意對性能的影響):

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}); 
相關問題