在 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 中的数组中搜索的主要内容,如果未能解决你的问题,请参考以下文章

搜索数组 MongoDB NodeJS

MongoDB / Mongoose - 数组内的文本搜索

如何匹配 MongoDB 中嵌入式数组或文档中的字符串?

nodejs + mongodb实现模糊查询与全文搜索

如何从 MongoDB 中的数组中查询具有最新日期的对象?

mongoDB中的索引数组/子对象导致重复键错误