_id上的mongo $和运算符不起作用

时间:2014-03-02 17:13:25

标签: mongodb

我的数据是:

{
    "_id" : ObjectId("53135e99f6af166c18000001"),
    "todos" : [{
            "date" : ISODate("2014-03-02T16:39:06.089Z"),
            "_id" : ObjectId("53135eaaf6af166c18000002"),
            "completed": false
        }, {
            "date" : ISODate("2014-03-02T16:46:48.717Z"),
            "_id" : ObjectId("53136078f6af166c18000003"),
            "completed": false
        }
    ]
}

我想查询todos数组中的特定待办事项:

db.users.find({
    $and : [{
            _id : ObjectId('53135e99f6af166c18000001')
        }, {
            todos : {
                $elemMatch : {
                    _id : ObjectId('53135eaaf6af166c18000002')
                }
            }
        }
    ]
}, {
    todos : 1,
    _id: 0
})

您能否解释为什么它会返回所有待办事项以及正确的查询?

2 个答案:

答案 0 :(得分:3)

这是一个更有效的查询,可以获得您想要的内容,因为您不需要使用$and$elemMatch

db.users.find({
    _id : ObjectId('53135e99f6af166c18000001'),
    'todos._id' : ObjectId('53135eaaf6af166c18000002')
}, {
    _id: 0,
    'todos.$' : 1
});

答案 1 :(得分:1)

您可以使用$ position投影来完成此操作。它限制查询结果中包含的字段的内容以包含第一个匹配元素。

db.users.find({
    $and : [{
            _id : ObjectId('53135e99f6af166c18000001')
        }, {
            todos : {
                $elemMatch : {
                    _id : ObjectId('53135eaaf6af166c18000002')
                }
            }
        }
    ]
}, {
    'todos.$' : 1,
    _id: 0
});