如何优化查询MongoDB查询的嵌套条件

时间:2019-04-24 03:53:25

标签: mongodb mongodb-query

我正在尝试查询我的收藏集,以显示允许查看的某些特定用户级别的报告和报告部分的列表。 该集合看起来像这样:

{ 
    "ReportName" : "Report A", 
    "ReportID" : "1", 
    "ReportSection" : [
        {
            "SectionName" : "ReportSection A", 
            "AllowedLevel" : [
                "1", 
                "2"
            ]
        }, 
        {
            "SectionName" : "ReportSection B", 
            "AllowedLevel" : [
                "1", 
                "2",
                "3"
            ]
        }, 
        {
            "SectionName" : "ReportSection C", 
            "AllowedLevel" : [

            ]
        }
    ]
}

查询的参数是用户级别。例如,用户级别“ 2”将被允许查看“报告和版面”:

  • 报告A和报告A部分
  • 报告A和报告B部分

现在我必须这样查询:

db.Report.find({
    "ReportSection.AllowedLevel":"2" 
});

我得到报告列表,然后在应用程序中,我必须检查每个报告部分的允许级别。我相信对此有更好的解决方案。

我希望得到这样的结果(假设用户级别为“ 2”)

{ 
    "ReportName" : "Report A", 
    "ReportID" : "1", 
    "SectionName" : "ReportSection A", 
},
{
    "ReportName" : "Report A",  
    "ReportID" : "1", 
    "SectionName" : "ReportSection B", 
}

2 个答案:

答案 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"
}