在Mongo DB中使用视图的性能优点/缺点

时间:2018-03-19 13:27:07

标签: java mongodb mongodb-query spring-data aggregation-framework

我有一个非常复杂的聚合查询,所以我想使用如下的视图:

 db.createView("weNeed","Master",
 [
{$project:
     {
         _id:"$_id",
         documents:{
            $concatArrays:[
             {$ifNull:
             [{$map:{
                input:"$documents.COMPLETED",
                 as:"document",
                 in:{
                     entity:"$name",
                     status:"COMPLETED",
                     name:"$$document.name",
                     category:"$$document.category",
                     description:"$$document.description",
                     submittedDate:"$$document.submittedDate",
                     expirationDate:"$$document.expirationDate",
                     uri:"$$document.uri"

                     }
             }},[]]},
             {$ifNull:
             [{$map:{
                input:"$documents.REQUIRED",
                 as:"document",
                 in:{ entity:"$name",
                     status:"REQUIRED",
                     name:"$$document.name",
                     category:"$$document.category",
                     description:"$$document.description",
                     submittedDate:"$$document.submittedDate",
                     expirationDate:"$$document.expirationDate",
                     uri:"$$document.uri"
                     }
             }},[]]},
             {$ifNull:
             [{$map:{
                input:"$documents.DEFERRED",
                 as:"document",
                 in:{ entity:"$name",
                     status:"DEFERRED",
                     name:"$$document.name",
                     category:"$$document.category",
                     description:"$$document.description",
                     submittedDate:"$$document.submittedDate",
                     expirationDate:"$$document.expirationDate",
                     "uri":"$$document.uri"
                     }
             }},[]]}
             ]
         }
     }
     }
     ]
     )

现在,我可以轻松地使用聚合。此外,在java-springdata中,我可以轻松地创建匹配的存储库并轻松访问数据。这种情况适用于任何其他语言或框架。这也很好地展示了我的需求。

请参阅以下查询,其大小非常简洁: -

db.weNeed.aggregate([
{
    $project:{
        documents:"$documents"
        }
    },
    {$unwind:"$documents"},
    {$sort:{
        "documents.entity":1,
        "documents.category":1,
        "documents.status":1,
        "documents.name":1
        }}
]
)

我试图找出在单个聚合查询中使用视图是否有任何性能下降。哈文没有。

以下是我的观点的一些优点: -

  1. 清洁代码。
  2. 您的数据视图,因此可以在不运行复杂查询的情况下从数据库中查看。
  3. 一旦原始Collection中有任何保存或更新,就会立即更新。
  4. 更好的表现,因为不会查询单个收集。
  5. 缺点: - 我对此不太了解。我还在想 对Clustreing不好。 2.对于那些对mongo知之甚少并且想要使用任何包装器框架的人来说可能是好的。

    此外,没有官方文件提及任何优点和缺点。

    请帮忙!

2 个答案:

答案 0 :(得分:2)

就性能而言,我相信您不会获得任何好处,因为视图不存储任何数据。它仅将查询存储在system.views中。因此,每当您要访问视图时,如果您的集合上没有正确的索引,它将实际执行聚合查询,那么您可能会期望响应缓慢。由于视图不存储任何数据,因此can't be indexed

请查看this了解相关信息。

答案 1 :(得分:1)

我发现视图无法用于任何较大的集合,不幸的是,我住的地方。.我发现视图find()执行没有智能将find()过滤器对象集成到视图中,而是通过扫描整个集合来运行视图,然后尝试过滤结果列表,从而导致性能降低。

示例: db.createView(myView,myCol,[{stage1} .. {stageN}]);; db.myView.find({myFilter});

...在大型myCol上比: db.myCol.aggregate([{“ $ match”:{myFilter}},{stage1} .. {stageN}])

(假设{“ $ match”:{myFilter}}是有效的聚合阶段)

动态地将过滤器集成到视图聚合中实际上将使视图概念可行。