Запрос 3-го уровня вложен

У меня есть БД в 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)

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

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

Спасибо!

Values ​​[0] Я предполагаю, что первые значения - это список, то же самое для Value2, если вы собираетесь его использовать и уверены, что он имеет только один элемент.

E.Serra 29.08.2018 16:10

Это не работает, но спасибо.

Jose Ruiz 29.08.2018 16:14

Я бы также изменил оператор find, если вы ищете по идентификатору, а затем посмотрите результат печати, например. collection.find ({"_ id": 1}) ДОЛЖНО быть достаточно (если вы НЕ хотите искать по идентификатору, помните, что идентификаторы уникальны, поэтому нет смысла добавлять что-то в поиск). Затем, как только вы получите ответ, попробуйте получить к нему доступ: resp ['Values'] [0] ['Value2'] [0] ['Value2_2'] ....

E.Serra 29.08.2018 16:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
51
2

Ответы 2

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

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

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

Output:

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

And if you try to search with _id then you don't need to use your second condition because by definition _id is always unique.

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

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

Если вы хотите получить из внутреннего массива только те элементы, которые соответствуют вашим внутренним условиям, вы можете агрегировать запрос 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
                }
            }
        }
    ])

Другие вопросы по теме