MongoDB使用$ in查询Mixed Type字段

时间:2015-06-12 20:12:56

标签: mongodb

我正在尝试使用Mixed Type查询$in字段,但似乎无效:

db.acts.find({user: { _id: { $in: [ObjectId("555b63c6b9aaf6d80aecccc3")] } }})

但我的用户的字段为_id,其值为ObjectId("555b63c6b9aaf6d80aecccc3")

为什么不起作用?

1 个答案:

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