我正在尝试使用Mixed Type
查询$in
字段,但似乎无效:
db.acts.find({user: { _id: { $in: [ObjectId("555b63c6b9aaf6d80aecccc3")] } }})
但我的用户的字段为_id
,其值为ObjectId("555b63c6b9aaf6d80aecccc3")
为什么不起作用?
答案 0 :(得分:1)
使用{field: <value>}
表示法匹配嵌入文档时,<value>
是要匹配的文档。不是文档查询。
换句话说,当你写:
{user: { _id: { $in: [ObjectId("555b63c6b9aaf6d80aecccc3")] }}}
MongoDB将尝试在字段{ $in: [ObjectId("555b63c6b9aaf6d80aecccc3")] }
中找到与文档_id
(字面意思!)的完全匹配。
您可以通过使用explain
:
> db.test.find({user: { _id: { $in: [ObjectId("555b63c6b9aaf6d80aecccc3")] }}}).explain().queryPlanner.parsedQuery
{
"user" : {
"$eq" : {
"_id" : {
"$in" : [
ObjectId("555b63c6b9aaf6d80aecccc3")
]
}
}
}
}
根据您的需要,您必须使用点符号重写您的查询:
{"user._id": { $in: [ObjectId("555b63c6b9aaf6d80aecccc3")] }}
请注意,这与您的初始查询不同,因为这将匹配给定数组中具有 id的任何嵌入文档。它不会搜索完全匹配(即:仅包含 id的嵌入式文档)。如果您以后真的需要,使用$or
是解决方案:
{$or: [{user: {_id: ObjectId("555b63c6b9aaf6d80aecccc3")}},
{user: {_id: ... }},
{user: {_id: ... }}
]}