Несколько условий соответствия для одного и того же элемента массива

У меня есть коллекция устройств с примерно 50 000 документов. Я пытаюсь запросить массив маршрутов в каждом документе и вернуть документ, если для отдельных элементов массива выполнено несколько условий. Проблема в том, что, похоже, Mongo возвращает ответы, в которых выполняется несколько условий для разных элементов массива.

Образец данных:

{
    "_id": 0,
    "name": "example1",
    "serial": "123456",
    "routes": [
        {
            "description": "8989",
            "zone": "front"
        },
        {
            "description": "1221",
            "zone": "back"
        }
    ]
},
{
    "_id": 1,
    "name": "example2",
    "serial": "987654",
    "routes": [
        {
            "description": "1515",
            "zone": "front"
        },
        {
            "description": "8989",
            "zone": "side"
        }
    ]
}

Я пробовал простые варианты .find () безуспешно, включая

db.devices.find({"routes.description":"8989", "routes.zone":"front"})
db.devices.find({"$and": [{"routes.description":"8989"}, {"routes.zone":"front"}]})

Я также пробовал агрегации, которые, кажется, меня не устраивают, поскольку я их элементарно понимаю. Желаемыми результатами для приведенных выше запросов будет один документ (_id: 0), а не оба документа.

{ "_id" : 0, "name" : "example1", "serial" : "123456", "routes" : [ { "description" : "8989", "zone" : "front" }, { "description" : "1221", "zone" : "back" } ] }

Кроме того, желательна возможность запрашивать массив с помощью оператора $ in. Например, желаемый результат следующего запроса будет обоими документами, поскольку оба из них имеют маршруты, соответствующие зоне: front и описания, которые находятся в списке.

db.devices.find({"$and": [{"routes.description": { $in: ["8989", "1515"] }}, {"routes.zone":"front"}]})

person r6danl99    schedule 31.08.2020    source источник


Ответы (1)


Вам просто нужно использовать здесь $ elemMatch.

db.devices.find({routes: {$elemMatch: {description:"8989", zone:"front"}}})

Пример

person namar sood    schedule 31.08.2020
comment
ты можешь на это ответить? stackoverflow.com/questions/67600862 / - person Tejas Ratunawar; 19.05.2021