У меня есть БД в 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)
Выход всегда «Нет».
Есть идеи о том, как сделать правильный запрос?
Спасибо!
Это не работает, но спасибо.
Я бы также изменил оператор find, если вы ищете по идентификатору, а затем посмотрите результат печати, например. collection.find ({"_ id": 1}) ДОЛЖНО быть достаточно (если вы НЕ хотите искать по идентификатору, помните, что идентификаторы уникальны, поэтому нет смысла добавлять что-то в поиск). Затем, как только вы получите ответ, попробуйте получить к нему доступ: resp ['Values'] [0] ['Value2'] [0] ['Value2_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
_idthen you don't need to use your second condition because by definition_idis 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
}
}
}
])
Values [0] Я предполагаю, что первые значения - это список, то же самое для Value2, если вы собираетесь его использовать и уверены, что он имеет только один элемент.