mongodb中的数组搜索
我有一个收集“房间用户”和这些文件-mongodb中的数组搜索,mongodb,find,mongodb-query,Mongodb,Find,Mongodb Query,我有一个收集“房间用户”和这些文件- /* 0 */ { "_id" : ObjectId("524d1ae07847c05671a2965c"), "room_name" : "room1", "members" : [ "user1", "user2" ] } /* 1 */ { "_id" : ObjectId("524d1aec7847c05671a2965d"), "room_name" : "roo
/* 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"
]
}
现在我想搜索/获取房间的名称(“房间名称”),其中只有user1和user2。这应该是您要查找的查询:
db.room_user.find(
{ "$and":
[
{ "members": { "$all": [ "user2", "user1" ] } } ,
{ "members": { "$size": 2 } }
]
},
{ "room_name": 1 }
)
room\u name
属性。请注意,您还将获得\u id
属性,除非您明确声明不需要它索引注意事项:
$all
运算符的文档中对使用该运算符时索引的使用作了如下说明(重点添加):
注意,在大多数情况下,MongoDB不将数组视为集合。这
运算符为这种方法提供了一个值得注意的例外在当前
使用$all
操作员的发布查询必须扫描所有文档
匹配查询数组中第一个元素的。因此,甚至
有了支持查询的索引,操作可能会长时间运行,
特别是当数组中的第一个元素不是非常
选择性。
我必须搜索/获取“房间名称”,因此无法在查询中提供该名称。我在没有房间名称的情况下尝试了此查询,但该查询不起作用:(文件室名称不在查询中。它在投影中。这是一个区别。保护定义了您希望Mongo返回的字段。查询很可能不起作用,因为对象比较是顺序敏感的。@Lix我不建议使用$all运算符,因为它是一个不使用索引的缓慢操作。请查看本文档中的注释link:[@ora-很好的观察!事实上,就性能而言,考虑到这一点是明智的。尽管如此,查询仍然有效。