Mongodb:查找包含多个SAME指定值的数组字段的文档

时间:2015-04-14 07:50:38

标签: mongodb

收集测试中有三个文件:

// 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。

我该怎么做?

3 个答案:

答案 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 } } }
])