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在您的回答中添加了我的评论。