如果我有以下3个文件。如何选择至少有两个紫色方块的文档。在这种情况下,它只是最后一个元素。
我知道我可以选择带有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
答案 0 :(得分:1)
这可以通过使用$ where,MapReduce或您的应用程序在插入/更新时增加有趣对象的数量来实现(例如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});
答案 1 :(得分:0)
仅通过$where