Как выбрать из имени поля из вложенных массивов в mongodb?

У меня есть документ с вложенными массивами, и я не могу понять, как выбрать из поля a.

Я хотел бы выбрать все документы, где «компоненты» имеют «мачту».

Я пытался.

db.sites.find({"components": "mast" } ).pretty();

db.sites.find({"components.$": "mast" } ).pretty();

db.sites.find({"components.$.$": "mast" } ).pretty();

db.sites.find({"components.$.$.mast": {$exists: true} } ).pretty();

db.sites.find({"components.$.mast": {$exists: true} } ).pretty();

db.sites.find({"components.mast": {$exists: true} } ).pretty();

и куча других неудачных попыток.

{
    "_id" : ObjectId("23456yujbvfdfg"),
    "d": 1234567,
    "components" : [
        [
            "mast",
            {
                "foo":"bar"
            }
        ],
        [
            "commsbox",
            {
                "BLARN": "bAAA"
            }
        ]
    ]
}

Мои попытки возвращают только пустые результаты.


person psykx    schedule 15.02.2019    source источник
comment
Что, если компоненты были массивом объектов? Ваши запросы ожидают этого. Мне кажется, что это ошибка моделирования данных.   -  person HIRA THAKUR    schedule 15.02.2019


Ответы (3)


Если вы поддерживаете компоненты в виде массива, ваш запрос должен выглядеть так:

db.test.find({ "components": { $elemMatch:  { $elemMatch:  {$eq:"mast"}  } }})

Я разместил решение на основе схемы, которой вы поделились, но я уверен, что схему необходимо изменить.

person DHIRAJ KATEKAR    schedule 15.02.2019
comment
Я изменил схему, так как я был слишком запутанным. - person psykx; 15.02.2019

Вы можете использовать $elemMatch

db.sites.find(
   { "components": { $elemMatch:  { $elemMatch:  {$eq:"mast"}  } }}
)
person HIRA THAKUR    schedule 15.02.2019

это должно работать

db.sites.find({
    "components": {
            $elemMatch: {
                $elemMatch: { $in: ['mast'] }
            }
    } 
})
person Abdelrahman Hossam    schedule 15.02.2019