Запросы к вложенному документу в MongoDB
У меня сложная структура документа, как показано ниже -
{
"Product Name" : "XYZ",
"Application" :
{ "DEF" :
{
"Year" :
{
"2018" :
{
"Quarter" :
{
"Q1" :
{
"Microservice" : ["A", "B"],
},
"Q2" :
{
"Microservice" : ["C", "D"],
},
"Q3" :
{
"Microservice" : ["E"],
},
"Q4" :
{
"Microservice" : ["F", "G"],
}
}
},
"2019" :
{
"Quarter" :
{
"Q1" :
{
"Microservice" : ["A", "C"],
},
"Q2" :
{
"Microservice" : ["D"],
},
"Q3" :
{
"Microservice" : ["E", "F"],
},
"Q4" :
{
"Microservice" : ["G"],
}
}
}
}
}
}
}
Я пытаюсь запросить все записи, где приложение DEF, год 2018 и все кварталы. Я попробовал обозначение DOT(.), Как показано ниже -
db.productsTest.find({"Application.DEF.Year.2018": {$exists: true}})
Выше приведены результаты для всех лет (2018 и 2019) вместо того, чтобы просто возвращать комбинацию года, квартала и микросервиса только для 2018. Это также может быть связано со структурой JSON, и я не могу фильтровать по году (так как они вложенные), В основном я ищу запрос, который возвращает это -
{
"Product Name" : "XYZ",
"Application" :
{ "DEF" :
{
"Year" :
{
"2018" :
{
"Quarter" :
{
"Q1" :
{
"Microservice" : ["A", "B"],
},
"Q2" :
{
"Microservice" : ["C", "D"],
},
"Q3" :
{
"Microservice" : ["E"],
},
"Q4" :
{
"Microservice" : ["F", "G"],
}
}
}
}
}
}
}
Возможен ли этот результат даже при моей структуре JSON?
2 ответа
Следующий запрос выполняет работу:
db.productsTest.find({
"Application.DEF.Year.2018": { $exists: true } // exclude documents from the result that do not contain the subdocument that we are interested in
}, {
"_id": 0, // we do not want the _id field in the result document
"Product Name" : 1, // but the "Product Name" should be included
"Application.DEF.Year.2018": 1 // and so should be the subdocument we are interested in
})
По сути, это просто стандартный запрос с проекцией.
$ Существует оператор элемента, который проверяет, существует свойство или нет.
Вы можете использовать $exists
Оператор, чтобы найти документы, которые содержат указанное поле! Это работает для меня, используя данные испытаний, которые вы предоставили:
db.productsTest.findOne({"Application.DEF.Year.2018.Quarter.Q1":{$exists:true}})
и возвращает тестовый документ, который вы предоставили.
В качестве примечания: если у вас нет веских оснований для использования этой глубоко вложенной структуры, уплощение документов может улучшить читаемость.