假设我们有一些文件如下:
{
"_id": {
"title": "ABC",
"version": 1
},
"status": "Submitted",
....
}
{
"_id": {
"title": "ABC",
"version": 2
},
"status": "Submitted",
....
}
{
"_id": {
"title": "XYZ",
"version": 1
},
"status": "Submitted",
....
}
如何为每个不同的version
获取最多title
的文档?
对于上面的数据集,结果应为:
{
"_id": {
"title": "ABC",
"version": 2
},
"status": "Submitted",
....
}
{
"_id": {
"title": "XYZ",
"version": 1
},
"status": "Submitted",
....
}
答案 0 :(得分:5)
这里的想法是首先按version
键对文档进行排序,然后按title
键对文档进行分组,并在订购时返回组中的第一个文档。因此,受邀参与聚合管道显示的运营商将是 $sort
, $group
和 $project
< / strong>(将聚合文档重新整形为所需的结果模式)。
现在,在 $group
管道中,您需要 $first
运算符(或 $last
< / strong>取决于您在之前的 $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,
...
}
}
])
对于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(...)
);
您还有另一种方法可以将 $$ROOT
系统变量邀请到 $group
管道作为返回完整文档的方法。请考虑以下方法:
db.collection.aggregate([
{ "$sort": { "_id.version": -1 } },
{
"$group": {
"_id": "$_id.title",
"doc": { "$first": "$$ROOT" }
}
},
{
"$project": {
"_id": "$doc._id",
"status": "$doc.status",
...
}
}
])
将转换为
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")...
);
答案 1 :(得分:1)
尝试使用Element.classList。
返回最大值。 $ max比较值和类型,使用指定的BSON比较顺序来表示不同类型的值。
您可以使用以下查询: -
aggregate(
[
{
$project:
{
_id: "$_id.title",
version: { $max: "$_id.version" },
status : "$status"
}
}
])
我没有尝试查询。如果您有任何错误,请告诉我。
希望这会有所帮助。