MongoDB - 如何将$ elemMatch与多个条件一起使用

时间:2014-12-02 22:08:14

标签: mongodb

我有一个具有以下记录结构的MongoDB记录。

{
    "_id" : ObjectId("547e29f2421aa9302705679a"),
    "runs" : [ 
        {
            "datetime" : "2014-04-2813:18:54.959579",
            "tag" : "v1.0",
        }, 
        {
            "datetime" : "2014-11-1122:45:13.841787",
            "tag" : "v1.1",
        }
    ],
    "person1" : "person1_id",
    "person2" : "person2_id"
}

我的一些记录会有更多或更少的runs,每个记录都有不同的tag。我正在尝试制定一个查询,告诉我哪些记录的runtag=v1.1带有run的{​​{1}}。

我刚刚开始学习MongoDB,但我提出了查询:

tag=v1.0

但是,这仍会返回db.mycollection.find( { $and: [ { runs : { $elemMatch : { tag : 'v1.1' } } }, { runs : { $elemMatch : { $ne: { tag : 'v1.0' } } } }, ]}) 的记录。我不知道我在哪里错了。 有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

我发现在正确的位置使用$not可以解决问题。

db.mycollection.find( { $and: [
  { runs : { $elemMatch : { tag : 'v1.1' } } },
  { runs : { $not: { $elemMatch : { tag : 'v1.0' } } } },
]}).count()

答案 1 :(得分:1)

您不需要$elemMatch,可以直接count()。仅当您想要$elemMatchupdate数组元素时才使用project

db.mycollection.count({$and:[{"runs.tag":"v1.1"},
                    {"runs.tag":{$not:{"$eq":"v1.0"}}}]})

find()

db.mycollection.find({$and:[{"runs.tag":"v1.1"},
                    {"runs.tag":{$not:{"$eq":"v1.0"}}}]})