[英]Query document with the max sub field
假設我們有一些文件如下:
{
"_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
(它將聚合文檔重新整形為所需的結果模式)。
現在在$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")...
);
嘗試使用$ max 。
返回最大值。 $ max比較值和類型,使用指定的BSON比較順序來表示不同類型的值。
您可以使用以下查詢: -
aggregate(
[
{
$project:
{
_id: "$_id.title",
version: { $max: "$_id.version" },
status : "$status"
}
}
])
我沒有嘗試查詢。 如果您有任何錯誤,請告訴我。
希望這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.