Как выбрать из имени поля из вложенных массивов в mongodb? - PullRequest
0 голосов
/ 15 февраля 2019

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

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

Я пробовал.

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

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

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

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

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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

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

db.sites.find({
    "components": {
            $elemMatch: {
                $elemMatch: { $in: ['mast'] }
            }
    } 
})
0 голосов
/ 15 февраля 2019

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

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

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

0 голосов
/ 15 февраля 2019

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

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