1

我有一个结构如下的 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
    }
  ]
}

如何找到所有将 roles.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”的编辑角色。我该如何解决这个查询?

谢谢。

4

2 回答 2

0

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

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

您的原始查询也与仅执行默认基本搜索相同,因为这也是 AND。问题是 AND 应用于文档的任何部分。

于 2012-11-09T15:55:57.557 回答
0

尝试简单 db.users.find({"roles.role_name":"Writer","roles.is_lead":1});

于 2012-11-09T15:56:51.383 回答