Jas*_*hao 4 mongodb nosql aggregation-framework
假设我们有一些文件如下:
{
"_id": {
"title": "ABC",
"version": 1
},
"status": "Submitted",
....
}
{
"_id": {
"title": "ABC",
"version": 2
},
"status": "Submitted",
....
}
{
"_id": {
"title": "XYZ",
"version": 1
},
"status": "Submitted",
....
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得version
每个不同的最大文件title
?
对于上面的数据集,结果应该是:
{
"_id": {
"title": "ABC",
"version": 2
},
"status": "Submitted",
....
}
{
"_id": {
"title": "XYZ",
"version": 1
},
"status": "Submitted",
....
}
Run Code Online (Sandbox Code Playgroud)
这里的想法是version
首先通过键对文档进行排序,按键对文档进行分组,title
并在订购时返回组中的第一个文档.因此,邀请到此处显示的聚合管道的运算符将是$sort
,$group
和$project
(它将聚合文档重新整形为所需的结果模式).
现在,在$group
管道中,您需要$first
操作员(或$last
根据您在先前$sort
管道中订购文档的方向)在订购时映射顶部文档的字段.
考虑mongo shell中的以下游戏:
db.collection.aggregate([
{ "$sort": { "_id.version": -1 } },
{
"$group": {
"_id": "$_id.title",
"id": { "$first": "$_id" },
"status": { "$first": "$status" }
...
}
},
{
"$project": {
"_id": "$id",
"status": 1,
...
}
}
])
Run Code Online (Sandbox Code Playgroud)
对于mongoTemplate等价物:
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
Aggregation agg = newAggregation(
sort(DESC, "_id.version"),
group("_id.title"),
.first("status").as("status")
...
project("id").previousOperation().and("status").and(...)
);
Run Code Online (Sandbox Code Playgroud)
您还有另一种方法可以将$$ROOT
系统变量引入$group
管道,作为返回完整文档的方法.考虑以下方法:
db.collection.aggregate([
{ "$sort": { "_id.version": -1 } },
{
"$group": {
"_id": "$_id.title",
"doc": { "$first": "$$ROOT" }
}
},
{
"$project": {
"_id": "$doc._id",
"status": "$doc.status",
...
}
}
])
Run Code Online (Sandbox Code Playgroud)
这将转化为
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
Aggregation agg = newAggregation(
sort(DESC, "_id.version"),
group("_id.title"),
.first(ROOT).as("doc")
project("doc.status").as("status")...
);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
343 次 |
最近记录: |