我需要一些帮助。我试图在另一个数组中找到一个数组。
记录:
{
"_id" : ObjectId("56b7e6966213e8d142ef55b7"),
"users" : [
ObjectId("56b0e547a838b5a45b4d0100"), // 0
ObjectId("56a7e16e37e5adf32b97cc3d") // 1
]
},
{
"_id" : ObjectId("56b7e6966213e8d142ef55b7"),
"users" : [
ObjectId("56b0e547a838b5a45b4d0100"),
ObjectId("56a7e16e37e5adf32b97cc3d"),
ObjectId("56b7e6b96213e8d142ef55b8")
]
}
我正在尝试只查找第一条记录"_id" : ObjectId("56b7e6966213e8d142ef55b7")
,
我正在使用查询:
db.collection.find({"users" : { $in: [
ObjectId("56b0e547a838b5a45b4d0100"),
ObjectId("56a7e16e37e5adf32b97cc3d")
]}})
或
db.collection.find({ $and: [{
"users": ObjectId("56b0e547a838b5a45b4d0100")
}, {
"users": ObjectId("56a7e16e37e5adf32b97cc3d")
}]})
回复给了我两条记录。
此请求给出了正确答案:
db.collection.find({"users" : [
ObjectId("56b0e547a838b5a45b4d0100"), // 0
ObjectId("56a7e16e37e5adf32b97cc3d") // 1
]})
但是如果记录有这样的数组:
{
"_id" : ObjectId("56b7e6966213e8d142ef55b7"),
"users" : [
ObjectId("56a7e16e37e5adf32b97cc3d"), // 1
ObjectId("56b0e547a838b5a45b4d0100") // 0
]
}
它不起作用
$ all,$ eq,$ in也不起作用
db.rooms.find({
users: {
$all: [
ObjectId("56a7e16e37e5adf32b97cc3d"),
ObjectId("56b0e547a838b5a45b4d0100")
]
}
})
我需要找到[1,2] == [1,2]或[1,2] == [2,1]
的行不在[1,2,3] == [1,2]
的位置如果有人可以帮助我,我将不胜感激。
答案 0 :(得分:1)
如果你所期望的是结果文件只有"只有"这两个数组条目,然后您想要的条件组合是$all
和$size
:
db.rooms.find({
"users": {
"$all": [
ObjectId("56b0e547a838b5a45b4d0100"),
ObjectId("56a7e16e37e5adf32b97cc3d")
],
"$size": 2
}
})
$all
基本上是$and
,语法较短,$size
区域自列表为n
条目,那么您只想匹配某些内容特定的长度/尺寸。
这比直接指定数组更好,因为它将以任何顺序匹配,而不是考虑到顺序不同而不匹配的此语句,因此不是" exact"匹配:
db.rooms.find({
"users": [
ObjectId("56a7e16e37e5adf32b97cc3d"),
ObjectId("56b0e547a838b5a45b4d0100")
]
})
逻辑上,数组包含" all"指定的条目,并且是相同的"大小"作为输入并没有什么不同。