#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