Запросы к вложенному документу в 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}})

и возвращает тестовый документ, который вы предоставили.

В качестве примечания: если у вас нет веских оснований для использования этой глубоко вложенной структуры, уплощение документов может улучшить читаемость.

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