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. 不能很好地使用 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}} 是一个有效的聚合阶段)
将过滤器动态集成到视图聚合中实际上会使视图概念可行。
| 归档时间: |
|
| 查看次数: |
4842 次 |
| 最近记录: |