收集测试中有三个文件:
// document 1
{
"id": 1,
"score": [3,2,5,4,5]
}
// document 2
{
"id": 2,
"score": [5,5]
}
// document 3
{
"id": 3,
"score": [5,3,3]
}
我想获取得分字段包含[5,5]的文档。
查询:
db.test.find( {"score": {"$all": [5,5]}} )
将返回文档1,2和3,但我只想获取文档1和2。
我该怎么做?
答案 0 :(得分:0)
在版本2.6中更改。
$ all相当于$和指定值的操作;即以下声明:
{ tags: { $all: [ "ssl" , "security" ] } }
相当于:
{ $and: [ { tags: "ssl" }, { tags: "security" } ] }
我认为你需要传入一个嵌套数组 -
所以试试
db.test.find( {"score": {"$all": [[5,5]]}} )
来源
在版本2.6中更改。
当传递嵌套数组的数组(例如[[" A"]])时,$ all现在可以匹配字段,其中字段包含嵌套数组作为元素(例如字段:[[& #34; A"],...]),或者字段等于嵌套数组(例如字段:[" A"])。
http://docs.mongodb.org/manual/reference/operator/query/all/
答案 1 :(得分:0)
在阅读了你的问题后,我个人认为mongodb还不支持这种查询。如果有人知道如何使用mongo查询找到它,他们会在这里挑衅地发布答案。
但我认为这可以使用mongo forEach方法,因此下面的代码会符合您的条件
db.collectionName.find().forEach(function(myDoc) {
var scoreCounts = {};
var arr = myDoc.score;
for (var i = 0; i < arr.length; i++) {
var num = arr[i];
scoreCounts[num] = scoreCounts[num] ? scoreCounts[num] + 1 : 1;
}
if (scoreCounts[5] >= 2) { //scoreCounts[5] this find occurrence of 5
printjsononeline(myDoc);
}
});
答案 2 :(得分:0)
您可以使用聚合来完成此操作。第一步可以使用{ "score" : 1 }
上的索引,但剩下的就是努力工作。
db.test.aggregate([
{ "$match" : { "score" : 5 } },
{ "$unwind" : "$score" },
{ "$match" : { "score" : 5 } },
{ "$group" : { "_id" : "$_id", "sz" : { "$sum" : 1 } } }, // use $first here to include other fields in the results
{ "$match" : { "sz" : { "$gte" : 2 } } }
])