在 Mongo DB 中使用视图的性能优势/劣势

Vin*_*ati 5 java mongodb spring-data mongodb-query 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"
                     }
             }},[]]}
             ]
         }
     }
     }
     ]
     )
Run Code Online (Sandbox Code Playgroud)

现在,我可以轻松地对其使用聚合。此外,In java-springdataI 可以轻松创建匹配的存储库并轻松访问数据。同样适用于任何其他语言或框架。这也很好地了解了我的需要。

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

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

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

以下是我认为的一些优势:-

  1. 更干净的代码。
  2. 数据视图,因此可以从数据库中查看,而无需运行复杂的查询。
  3. 一旦原始集合中有任何保存或更新,就会立即更新。
  4. 由于不查询单个集合,因此性能更好。

缺点:- 这个我不太确定。我仍然认为 1. 不能很好地使用 Clustreing。2. 可能适合那些对 mongo 了解较少并想要使用任何包装器框架的人。

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

请帮忙!

小智 6

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

例子:

db.createView(myView,myCol,[{stage1}..{stageN}]);
db.myView.find({myFilter});
Run Code Online (Sandbox Code Playgroud)

...在大型 myCol 上比以下慢得多:

db.myCol.aggregate([{"$match":{myFilter}},{stage1}..{stageN}])
Run Code Online (Sandbox Code Playgroud)

(前提是{"$match":{myFilter}} 是一个有效的聚合阶段)

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


Ami*_*era 5

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

看看this以获取一些信息。