Запрос для всех документов, когда какой-либо элемент массива найден в поле в mongodb

#mongodb #pymongo

#mongodb #pymongo

Вопрос:

У меня есть такой документ:

 [
  {
    "id": 1,
    "active": true,
    "key": []
  },
  {
    "id": 2,
    "active": true,
    "key": [
      {
        "code": "fake_code",
        "ids": [
          ""
        ],
        "labels": [
          "d"
        ]
      }
    ]
  },
  {
    "id": 3,
    "active": true,
    "key": [
      {
        "code": "fake_code",
        "ids": [
          ""
        ],
        "labels": [
          "a",
          "b",
          "c"
        ]
      }
    ]
  }
]
 

Я хочу получить только id те документы, в которых любое из значений данного массива (скажем, [«a», «b», «c», «d»]) присутствует в labels поле в документах.

Это означает, что, поскольку данный массив = [«a», «b», «c», «d»], и если вы увидите документы, то вы можете найти документ id = 2 , имеющий [«d»] в labels поле, а документ, имеющий id = 3 имеет [«a», «b», «c»] в нем labels .

Итак, ожидаемый результат выглядит так,

 [
  {
    "id": 2
  },
  {
    "id": 3
  }
]
 

В настоящее время я использую

 db.collection.find({
  "key": {
    "$all": [
      {
        "$elemMatch": {
          "ids": {
            "$in": [
              ""
            ]
          },
          "code": "fake_code",
          "labels": {
            "$in": [
              [
                "a",
                "b",
                "c"
              ]
            ]
          }
        }
      }
    ]
  }
},
{
  _id: 0,
  id: 1
})
 

Этот запрос может вернуть мне только один документ, имеющий id = 3 , потому что в этом случае я использую данный массив = [«a», «b», «c»] . Но возможно ли получить все документы в соответствии с данным массивом (например, [«a», «b», «c», «d»]), это означает, что если какой-либо документ имеет хотя бы одно совпадающее значение из данного массива, то запрос должен возвращать id эти документы?

Спасибо

Комментарии:

1. Я не знаю, хорошо ли я понял, потому что я это понимаю. Если все в порядке, я могу объяснить в ответе

2. Эй, у меня есть массив типа [«a», «b», «c», «d»]. и я не могу написать подобное $in: [ "a", "b", "c", "d"] . Я должен написать, как $in: [["a", "b","c", "d"]] . Итак, можете ли вы сказать мне, можем ли мы каким-либо образом использовать какой-либо другой селектор запросов для достижения этой цели?

3. Я не понимаю, почему вы пишете что-то вроде $in: [["a", "b","c", "d"]]

4. На самом деле, в моем случае я использую pymongo. И я получаю массив (как и в вопросе, я назвал его заданным массивом). И мне нужно получить результат, как указано в вопросе. Надеюсь, вы меня поняли.

5. если вы получаете массив, подобный [ "a", "b", "c", "d"] , почему вы добавляете его снова в другой массив? вы можете передать его напрямую, нет!! если я не ошибаюсь. И извините, если я ошибаюсь, я не специалист по python

Ответ №1:

Вы можете использовать $in . Если у вас нет никаких условий внутри $elemMatch , вы можете получить прямой доступ "key.labels":{$in:[....]}

 db.collection.find({
  key: {
    $elemMatch: {
      labels: {
        $in: [
          "a",
          "b",
          "c",
          "d"
        ]
      }
    }
  }
},
{
  _id: 0,
  id: 1
})
 

Работает игровая площадка Mongo