我的数据是:
{
"_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
})
您能否解释为什么它会返回所有待办事项以及正确的查询?
答案 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
});