我正在尝试查询我的收藏集,以显示允许查看的某些特定用户级别的报告和报告部分的列表。 该集合看起来像这样:
{
"ReportName" : "Report A",
"ReportID" : "1",
"ReportSection" : [
{
"SectionName" : "ReportSection A",
"AllowedLevel" : [
"1",
"2"
]
},
{
"SectionName" : "ReportSection B",
"AllowedLevel" : [
"1",
"2",
"3"
]
},
{
"SectionName" : "ReportSection C",
"AllowedLevel" : [
]
}
]
}
查询的参数是用户级别。例如,用户级别“ 2”将被允许查看“报告和版面”:
现在我必须这样查询:
db.Report.find({
"ReportSection.AllowedLevel":"2"
});
我得到报告列表,然后在应用程序中,我必须检查每个报告部分的允许级别。我相信对此有更好的解决方案。
我希望得到这样的结果(假设用户级别为“ 2”)
{
"ReportName" : "Report A",
"ReportID" : "1",
"SectionName" : "ReportSection A",
},
{
"ReportName" : "Report A",
"ReportID" : "1",
"SectionName" : "ReportSection B",
}
答案 0 :(得分:0)
也许在聚合中展开报告部分,然后找到匹配的部分并索引允许的级别,这可能会更快吗?您必须对其进行测试,以查看其如何用于您的模式。
db.Report.aggregate([{
$unwind:ReportSection
},{
$match:{
.....
}
}])
答案 1 :(得分:0)
尝试如下:
db.collection.aggregate([
{
$unwind: "$ReportSection"
},
{
$unwind: "$ReportSection.AllowedLevel"
},
{
$match: {
"ReportSection.AllowedLevel": "2"
}
},
{
$project: {
"ReportName":1,
"ReportID":1,
"SectionName": "$ReportSection.SectionName"
}
}
])
结果将如下所示:
/* 1 createdAt:24/04/2019, 10:35:24*/
{
"_id" : ObjectId("5cbfee945d13d8232aff6e97"),
"ReportName" : "Report A",
"ReportID" : "1",
"SectionName" : "ReportSection A"
},
/* 2 createdAt:24/04/2019, 10:35:24*/
{
"_id" : ObjectId("5cbfee945d13d8232aff6e97"),
"ReportName" : "Report A",
"ReportID" : "1",
"SectionName" : "ReportSection B"
}