Запрос 3-го уровня вложенный - PullRequest
0 голосов
/ 29 августа 2018

У меня есть база данных в MongoDB, которая имеет 3 уровня, и я хочу получить значение из последнего уровня. Структура следующая:

{
    "_id" : "10000",
    "Values" : [
        {
            "Value1" : "Article 1",
            "Value2" : [
                {
                    "Value2_1" : 1,
                    "Value2_2" : 2,
                }
            ]
        }
    ]
}

Мне нужно получить значение из метки "Value2_1".

Пока мой код следующий:

for row in collection.find({"_id":1, "Values.Value2.Value2_1":1})
     print(row)

Выход всегда "Нет".

Есть идеи, как сделать правильный запрос?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Если вы хотите специально получить только те элементы из внутреннего массива, которые удовлетворяют вашим внутренним условиям, вы можете агрегировать запрос PS - Мои 2 цента - я не знаю, требуется ли вам это, так как я не мог получить это ясно из вашего вопроса, я просто подумал, что вы, возможно, спрашиваете об этом.

db.coll.aggregate([{
            $unwind: '$Values'
        }, {
            $project: {
                'Values_F': {
                    $filter: {
                        input: "$Values.Value2",
                        as: "value2",
                        cond: {
                            $eq: ["$$value2.Value2_1", 1]
                        }
                    }
                }
            }
        }, {
            $project: {
                'Values_F': 1,
                'total': {
                    $size: '$Values_F'
                }
            }
        }, {
            $match: {
                total: {
                    $gte: 1
                }
            }
        }
    ])
0 голосов
/ 29 августа 2018

Используя точку (.), вы можете получить ожидаемый результат.

db.collection.find({"Values.Value2.Value2_1" : 100})

Приведенный выше запрос выберет все документы, в которых массив Values имеет массив Values2, а Values2 имеет Values2_1, значение которого равно 100

Выход:

{
    "_id" : ObjectId("5b86bd1172876096c7a9d6cf"),
    "Values" : [ 
        {
            "Value1" : "Article 1",
            "Value2" : [ 
                {
                    "Value2_1" : 100.0,
                    "Value2_2" : 200.0
                }, 
                {
                    "Value2_1" : 15.0,
                    "Value2_2" : 25.0
                }
            ]
        }
    ]
}

И если вы попытаетесь выполнить поиск с помощью _id, вам не нужно будет использовать второе условие, потому что по определению _id всегда уникально.

Этот следующий запрос также покажет тот же результат, что и выше.

db.collection.find({"_id" : ObjectId("5b86bd1172876096c7a9d6cf")})
...