MongoDB中嵌套文档的查询

MongoDB中嵌套文档的查询,mongodb,nested-documents,Mongodb,Nested Documents,我有一个复杂的文档结构,如下所示- { "Application": { "DEF": { "Year": { "2018": { "Quarter": { "Q1": { "Microservice": [ "A", "B" ]

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

{
    "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" ]
                        }
                    }
                }
            }
        }
    },
    "Product Name": "XYZ"
}
db.productsTest.find({"Application.DEF.Year.2018": {$exists: true}})
我试图查询应用程序为DEF、年份为2018以及所有季度的所有记录。我试过下面的点(.)符号--

以上返回所有年份(2018年和2019年)的结果,而不是仅返回2018年的年度、季度和微服务组合。这也可能是因为JSON结构,我不能按年份过滤(因为它们是嵌套的)。基本上,我在寻找返回这个结果的查询--


考虑到我的JSON结构,这个结果可能吗?

以下查询完成了任务:

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
})
基本上,这只是一个标准与一个


是一个用于检查属性是否存在的查询。

以下查询将完成该任务:

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}})
并返回您提供的测试文档


作为旁注:除非您有充分的理由使用此方法,否则嵌套结构的展开有助于提高文档的可读性。

您可以使用
$exists
操作符查找包含指定字段的文档!使用您提供的测试数据,这对我有效:

db.productsTest.findOne({"Application.DEF.Year.2018.Quarter.Q1":{$exists:true}})
并返回您提供的测试文档



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

我正要回答这个问题,以10-20秒的优势击败我。请接受我诚挚的歉意,让我们看看我们的答案是否正确。首先,我对JSON结构做了一些修改,以便更好地解释我的问题。基本上,我正在为上面给出的嵌套文档寻找查询结构。正如您在JSON中看到的,可能有多年、季度甚至应用程序。当我知道键的确切值时,您的查询就会工作——在我的例子中是年(在我们的示例中是2018年)和季度(Q1)。然而,如果我只想搜索某一年的所有季度,我该如何实现?谢谢你到目前为止的帮助好的。。那是个愚蠢的问题。。在这种情况下,查询将更改为--db.productsTest.find({“Application.DEF.Year.2018”:{$exists:true}})@Souvik:请给我们一个精确输入文档和预期输出的示例,我们将能够帮助您。我正要回答这个问题,以10-20秒的优势击败我。请接受我诚挚的歉意,让我们看看我们的答案是否正确。首先,我对JSON结构做了一些修改,以便更好地解释我的问题。基本上,我正在为上面给出的嵌套文档寻找查询结构。正如您在JSON中看到的,可能有多年、季度甚至应用程序。当我知道键的确切值时,您的查询就会工作——在我的例子中是年(在我们的示例中是2018年)和季度(Q1)。然而,如果我只想搜索某一年的所有季度,我该如何实现?谢谢你到目前为止的帮助好的。。那是个愚蠢的问题。。在这种情况下,查询将更改为--db.productsTest.find({“Application.DEF.Year.2018”:{$exists:true}})@Souvik:请给我们一个精确输入文档和预期输出的示例,我们将能够帮助您。尽管我同意这种特定文档结构看起来不太理想的说法,从性能的角度来看,扁平结构实际上不是首选方案,而深嵌套是一种选择。IIRC,这是因为BSON处理工作的方式。天哪,在写我的时提交了类似的答案:/Thank@dnickless,这是我的一点猜测,我会编辑我的答案。虽然我同意这样的说法,即从性能角度来看,这个特定的文档结构看起来不太理想,扁平结构实际上不是首选方案,而深嵌套是一种选择。IIRC,这是因为BSON处理工作的方式。天哪,在写我的时提交了类似的答案:/Thank@dnickless,这是我的一点猜测,我会编辑我的答案。你到底想得到什么结果?您可以发布一份预期结果文档的样本吗?@dnickless在您的回答中添加了我的评论。您到底想得到什么结果?您能发布一份预期结果文档的样本吗?@dnickless在您的回答中添加了我的评论。