1

I have a collection "room_user" with these document -

/* 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"
    ]
}

Now I want to search/get the name of room ("room_name") where ONLY user1 and user2 are.

4

1 回答 1

2

这应该是您要查找的查询:

db.room_user.find(
  { "$and": 
    [ 
      { "members": { "$all": [ "user2", "user1" ] } } ,
      { "members": { "$size": 2 } } 
    ]
  },
  { "room_name": 1 }
)
  1. 查询的第一部分匹配包含所有所需元素的成员数组。此外,它只会匹配大小为 2 的数组。

  2. 第二部分是我们只返回room_name属性的投影。_id请注意,除非您明确声明不想要它,否则您还将获得该属性。


索引注意事项:

操作员的文档对$all使用此操作员时使用索引有这样的说法(强调添加):

注意在大多数情况下,MongoDB 不会将数组视为集合。此运算符为这种方法提供了一个明显的例外。在当前版本中,使用$all运算符的查询必须扫描与查询数组中第一个元素匹配的所有文档。因此,即使使用索引来支持查询,操作也可能需要长时间运行,特别是当数组中的第一个元素不是很有选择性时。

于 2013-10-03T07:44:24.030 回答