查询MongoDB中的嵌套文档

时间:2017-11-29 20:37:43

标签: mongodb nested-documents

我有一个复杂的文档结构,如下所示 -

   {
    "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"],
                                                                    }
                                                        }

                                                }
                                    }
                            }
                        }

} 

我正在尝试查询Application是DEF,Year是2018和所有Quarters的所有记录。我尝试了下面的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 个答案:

答案 0 :(得分:3)

以下查询完成了工作:

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
})

基本上,这只是标准的query projection

$existselement operator,用于检查属性是否存在。

答案 1 :(得分:2)

您可以使用$exists运算符查找包含指定字段的文档!这适用于我使用您提供的测试数据:

db.productsTest.findOne({"Application.DEF.Year.2018.Quarter.Q1":{$exists:true}})

并返回您提供的测试文档。

作为旁注:除非你有充分的理由深入使用嵌套结构,否则展平文档有助于提高可读性。