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 }
)
  • 查询的第一部分匹配包含所有所需元素的members数组。此外,它将只匹配大小为2的数组

  • 第二部分是投影,我们只返回
    room\u name
    属性。请注意,您还将获得
    \u id
    属性,除非您明确声明不需要它


  • 索引注意事项:
    $all
    运算符的文档中对使用该运算符时索引的使用作了如下说明(重点添加):

    注意,在大多数情况下,MongoDB不将数组视为集合。这 运算符为这种方法提供了一个值得注意的例外在当前 使用
    $all
    操作员的发布查询必须扫描所有文档 匹配查询数组中第一个元素的。因此,甚至 有了支持查询的索引,操作可能会长时间运行, 特别是当数组中的第一个元素不是非常 选择性。


    我必须搜索/获取“房间名称”,因此无法在查询中提供该名称。我在没有房间名称的情况下尝试了此查询,但该查询不起作用:(文件室名称不在查询中。它在投影中。这是一个区别。保护定义了您希望Mongo返回的字段。查询很可能不起作用,因为对象比较是顺序敏感的。@Lix我不建议使用$all运算符,因为它是一个不使用索引的缓慢操作。请查看本文档中的注释link:[@ora-很好的观察!事实上,就性能而言,考虑到这一点是明智的。尽管如此,查询仍然有效。