在 MongoDB 中的数组中搜索
Posted
技术标签:
【中文标题】在 MongoDB 中的数组中搜索【英文标题】:Search in Array in mongodb 【发布时间】:2013-10-03 07:39:38 【问题描述】:我有一个包含这些文档的集合“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"
]
现在我想搜索/获取只有 user1 和 user2 所在的房间名称(“room_name”)。
【问题讨论】:
【参考方案1】:这应该是您要查找的查询:
db.room_user.find(
"$and":
[
"members": "$all": [ "user2", "user1" ] ,
"members": "$size": 2
]
,
"room_name": 1
)
查询的第一部分匹配包含所有所需元素的成员数组。另外它只会匹配一个大小为2的数组。
第二部分是我们只返回room_name
属性的投影。请注意,除非您明确声明不想要它,否则您还将获得 _id
属性。
索引注意事项:
$all
运算符的文档对使用此运算符时使用索引有这样的说法(强调):
注意在大多数情况下,MongoDB 不会将数组视为集合。这 运算符为这种方法提供了一个明显的例外。 在当前 使用
$all
运算符的发布查询必须扫描所有文档 匹配查询数组中的第一个元素。结果,即使 使用索引支持查询,操作可能会长时间运行, 特别是当数组中的第一个元素不是很 选择性的。
【讨论】:
我必须搜索/获取“room_name”,因此无法在查询中提供。我在没有 room_name 的情况下尝试了这个查询,但它不起作用:( 房间名称不在查询中。它在投影中。它们是有区别的。保护定义了你希望 Mongo 返回的字段 查询很可能不起作用,因为对象比较是顺序敏感的。 @Lix 我不建议使用 $all 运算符,因为它是一个不使用索引的慢操作。请查看此链接中的注释:[docs.mongodb.org/manual/reference/operator/all/#op._S_all] @ora - 很好的观察!实际上,考虑到这一点是明智的。话虽如此 - 查询仍然有效。以上是关于在 MongoDB 中的数组中搜索的主要内容,如果未能解决你的问题,请参考以下文章