只要您意识到匹配的是 ObjectId,而不是参考集合中的任何内容,就可以使用
$in
运算符:
db.collection.find({ "members": { "$in": [ "some id 1", "some id 2" ] } })
当然,这些是您实际的ObjectId值。
但是,如果您真的指的是具有完全相同数组的文档,则只需传入该数组:
db.collection.find({ "members": [ "some id 1", "some id 2" ] })
如果查询需要同时包含两个元素,但也可以包含其他元素,则目前需要使用一个 $and
表达式:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
]})
从2.6版本开始,您可以正确使用$all
运算符有效地完成相同的操作:
db.collection.find({ "members": { "$all": [ "some id 1", "some id 2" ] } })
另一种形式是仅匹配这两个元素,但顺序可以任意。因此有两种方法:
db.collection.find({ "$or": [
{ "members": [ "some id 1", "some id 2" ] },
{ "members": [ "some id 2", "some id 1" ] }
]})
这里使用逻辑运算符
$or
,表示数组必须是精确的,但可以按任意方式排列。另一种方法是:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
{ "members": { "$size": 2 } }
]})
因此,使用$size
可以确保当数组包含匹配的两个元素时,也只有两个元素。相比于使用$or
,特别是对于较大的数组而言,这是一种更优雅的语法。
随着未来版本的发布,这种语法会变得更加简洁:
db.collection.find({ "$and": [
{ "members": { "$all": [ "some id 1", "some id 2" ] } },
{ "members": { "$size": 2 } }
]})
那基本上涵盖了所有的解释。