在mongodb中搜索数组

时间:2013-10-03 07:39:38

标签: mongodb find mongodb-query

我有一个带有这些文件的集合“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"
    ]
}

现在我想搜索/获取房间名称(“room_name”),其中只有user1和user2。

1 个答案:

答案 0 :(得分:2)

这应该是您正在寻找的查询:

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

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


  3. 索引注意事项:

    $all运算符的文档说明了在使用此运算符时使用索引(重点已添加):

      

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