MongoDb 查询以获取数组内字段的最大值

Arv*_*ngh 4 mongodb mongodb-query aggregation-framework

如何在下面的文档中获得最大的sections.Id,其中collection._id = some parameter

{
    "_id" : ObjectId("571c5c87faf473f40fd0317c"),
    "name" : "test 1",
    "sections" : [ 
        {
             "Id" : 1,
             "name" : "first section"
        }, 
        {
            "Id" : 2,
            "name" : "section 2"
        }, 
        {
            "Id" : 3,
            "name" : "section 3"
        }
}
Run Code Online (Sandbox Code Playgroud)

我在下面试过

db.collection.aggregate(
[
    {
        "$match": {
            "_id": ObjectId("571c5c87faf473f40fd0317c")
        }
    },
    {
        "$group" : {
            "_id" : "$_id",
            "maxSectionId" : {"$max" : "$sections.Id"}
        }
    }
]);
Run Code Online (Sandbox Code Playgroud)

但是它不是返回 max int 单个值,而是返回部分数组中所有 Id 的数组。

在 node.js 中执行进一步相同的查询时,它返回一个空数组。

Ash*_*shh 11

您可以使用简单的$project舞台

就像是 this

db.collection.aggregate([
  { "$project": {
    "maxSectionId": {
      "$arrayElemAt": [
        "$sections",
        {
          "$indexOfArray": [
            "$sections.Id",
            { "$max": "$sections.Id" }
          ]
        }
      ]
    }
  }}
])
Run Code Online (Sandbox Code Playgroud)


kak*_*ake 5

您的聚合查询需要$unwind opennig 到"sections"数组

添加您的聚合查询

{$unwind : "$sections"}
Run Code Online (Sandbox Code Playgroud)

和你这样的重构聚合查询

db.collection.aggregate(
[  
    {$unwind : "$sections"},
    {
        "$match": {
            "_id": ObjectId("571c5c87faf473f40fd0317c")
        }
    },
    {
        "$group" : {
            "_id" : "$_id",
            "maxSectionId" : {"$max" : "$sections.Id"}
        }
    }
]);
Run Code Online (Sandbox Code Playgroud)

以及更多知识$unwindhttps : //docs.mongodb.org/manual/reference/operator/aggregation/unwind/