我有一个非常复杂的聚合查询,所以我想使用如下的视图:
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
}}
]
)
我试图找出在单个聚合查询中使用视图是否有任何性能下降。哈文没有。
以下是我的观点的一些优点: -
缺点: - 我对此不太了解。我还在想 对Clustreing不好。 2.对于那些对mongo知之甚少并且想要使用任何包装器框架的人来说可能是好的。
此外,没有官方文件提及任何优点和缺点。
请帮忙!
答案 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}}是有效的聚合阶段)
动态地将过滤器集成到视图聚合中实际上将使视图概念可行。