使用max子字段查询文档

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)

chr*_*dam 5

这里的想法是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)