簡體   English   中英

使用max子字段查詢文檔

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM