Mongodb 在数组中搜索多个字段

Mongodb 在数组中搜索多个字段,mongodb,Mongodb,我有一个MongoDB文档,其结构如下: { "user_id": 7387, "first_name": "Daniel", "roles": [ { "role_id": "509c20144fd846549e8d42ef", "role_name": "Writer", "is_lead": 0 }, { "role_id": "509c20344fd846549e8d42f0", "role_

我有一个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\u name作为编写者和roles.is\u lead作为1的用户(所有同时也是lead的编写者)

我试过:

db.users.find({$and:[{"roles.role_name":"Writer","roles.is_lead":1}]});
在上面的例子中,它应该只返回“Tom”。但是这会返回“Tom”和“Daniel”(我猜它会为“Daniel”的编辑角色选择{roles.is_lead:1})。我如何修复这个查询


谢谢。

您需要的是确保搜索匹配特定元素,而不是同一文档中任何元素的混合

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

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

尝试简单地使用db.users.find({“roles.role\u name”:“Writer”,“roles.is\u lead”:1})你试过我最近的更新吗?我的第一个答案是错的。但是elemMatch适合我
db.test.find({roles: {$elemMatch: {role_name:"Writer", is_lead:1}}})