使用max子字段查询文档

时间:2016-06-13 07:17:47

标签: mongodb aggregation-framework nosql

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

{
  "_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",
  ....
}

2 个答案:

答案 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"
     }
 }
])

我没有尝试查询。如果您有任何错误,请告诉我。

希望这会有所帮助。