搜索数组中的多个字段

时间:2012-11-09 15:44:10

标签: mongodb

我有一个像这样结构的MongoDB文档:

{
  "user_id": 7387,
  "first_name": "Daniel",
  "roles": [
    {
      "role_id": "509c20144fd846549e8d42ef",
      "role_name": "Writer",
      "is_lead": 0
    },
    {
      "role_id": "509c20344fd846549e8d42f0",
      "role_name": "Editor",
      "is_lead": 1
    }
  ]
},
{
  "user_id": 15735,
  "first_name": "Tom",
  "roles": [
    {
      "role_id": "509c203f4fd846549e8d42f1",
      "role_name": "Admin",
      "is_lead": 0
    },
    {
      "role_id": "509c20144fd846549e8d42ef",
      "role_name": "Writer",
      "is_lead": 1
    },
    {
      "role_id": "509c20344fd846549e8d42f0",
      "role_name": "Editor",
      "is_lead": 0
    }
  ]
}

如何找到所有将role.role_name作为Writer并将roles.is_lead作为1的所有用户(所有同时也是潜在客户的作者)?

我试过了:

db.users.find({$and:[{"roles.role_name":"Writer","roles.is_lead":1}]});

在上面的示例中,它应该只返回“Tom”。但这会返回“Tom”和“Daniel”(我猜它会选择{roles.is_lead:1}作为“Daniel”的编辑角色。我该如何修复此查询?

感谢。

2 个答案:

答案 0 :(得分:0)

您要找的是$elemMatch,以确保您的搜索与特定元素匹配,而不是同一文档中任何元素的混合。

db.test.find({roles: {$elemMatch: {role_name:"Writer", is_lead:1}}})

您的原始查询也与进行默认基本搜索相同,因为它也是一个AND。问题是AND正在应用于文档的任何部分。

答案 1 :(得分:0)

只需尝试db.users.find({“roles.role_name”:“Writer”,“roles.is_lead”:1});