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" の両方を返します ("Daniel" の編集者の役割に対して {roles.is_lead:1} を選択すると思います。このクエリを修正するにはどうすればよいですか?

ありがとう。

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 に答える