我有一个带有这些文件的集合“room_user” -
/* 0 */
{
"_id" : ObjectId("524d1ae07847c05671a2965c"),
"room_name" : "room1",
"members" : [
"user1",
"user2"
]
}
/* 1 */
{
"_id" : ObjectId("524d1aec7847c05671a2965d"),
"room_name" : "room2",
"members" : [
"user1",
"user2",
"user3"
]
}
/* 2 */
{
"_id" : ObjectId("524d1af27847c05671a2965e"),
"room_name" : "room3",
"members" : [
"user1",
"user2",
"user4"
]
}
/* 3 */
{
"_id" : ObjectId("524d1b387847c05671a2965f"),
"room_name" : "room4",
"members" : [
"user1",
"user5"
]
}
现在我想搜索/获取房间名称(“room_name”),其中只有user1和user2。
答案 0 :(得分:2)
这应该是您正在寻找的查询:
db.room_user.find(
{ "$and":
[
{ "members": { "$all": [ "user2", "user1" ] } } ,
{ "members": { "$size": 2 } }
]
},
{ "room_name": 1 }
)
查询的第一部分与包含所有所需元素的成员数组匹配。此外,它只匹配大小为2的数组。
第二部分是我们仅返回room_name
属性的投影。请注意,除非您明确说明您不需要,否则您还将获得_id
属性。
$all
运算符的文档说明了在使用此运算符时使用索引(重点已添加):
注意在大多数情况下,MongoDB不会将数组视为集合。这个 运算符为此方法提供了一个值得注意的例外。 目前 使用
$all
运算符的发布查询必须扫描所有文档 与查询数组中的第一个元素匹配。结果,甚至 使用索引来支持查询,操作可能会长时间运行, 特别是当数组中的第一个元素不是很多时 选择性的。强>