我有一个复杂的文档结构,如下所示 -
{
"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结构,这个结果是否可能?
答案 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。
$exists是element operator,用于检查属性是否存在。
答案 1 :(得分:2)
您可以使用$exists
运算符查找包含指定字段的文档!这适用于我使用您提供的测试数据:
db.productsTest.findOne({"Application.DEF.Year.2018.Quarter.Q1":{$exists:true}})
并返回您提供的测试文档。
作为旁注:除非你有充分的理由深入使用嵌套结构,否则展平文档有助于提高可读性。