gpt4 book ai didi

mongodb - 使用最大子字段查询文档

转载 作者:可可西里 更新时间:2023-11-01 09:11:16 24 4
gpt4 key购买 nike

假设我们有如下一些文档:

{
"_id": {
"title": "ABC",
"version": 1
},
"status": "Submitted",
....
}

{
"_id": {
"title": "ABC",
"version": 2
},
"status": "Submitted",
....
}

{
"_id": {
"title": "XYZ",
"version": 1
},
"status": "Submitted",
....
}

如何为每个不同的 title 获取具有最大 version 的文档?

对于上面的数据集,结果应该是:

{
"_id": {
"title": "ABC",
"version": 2
},
"status": "Submitted",
....
}

{
"_id": {
"title": "XYZ",
"version": 1
},
"status": "Submitted",
....
}

最佳答案

这里的想法是先按version 键对文档进行排序,然后按title 键对文档进行分组,并在排序时返回组中的第一个文档。因此,受邀参加此处聚合管道展示的运营商将是 $sort , $group $project (将聚合文档 reshape 为所需的结果模式)。

现在在 $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,
...
}
}
])

对于等效的 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")...
);

关于mongodb - 使用最大子字段查询文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37783808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com