【问题标题】:MongoDb Group BY MAX date and get field from this documentMongoDb Group BY MAX date 并从此文档中获取字段
【发布时间】:2019-10-23 14:06:59
【问题描述】:

看看我的问题呵呵。我不知道我该怎么做。 有很多assetState 1..n 我想进行聚合以按资产获取最后一个资产状态组。

Mongo 集合:assetState

[
{
    "lsd" : {
     "$id" : ObjectId("lucas")
    },
    "stateDate" : ISODate("2018-09-10T16:26:44.501Z"),
    "assetId" : ObjectId("5b96b7645f2b3c0101520s60")
},
{
    "lsd" : {
     "$id" : ObjectId("denner")
    },
    "stateDate" : ISODate("2018-09-10T17:26:44.501Z"),
    "assetId" : ObjectId("5b96b7645f2b3c0101520s60")
},
{
    "lsd" : {
     "$id" : ObjectId("denner")
    },
    "stateDate" : ISODate("2018-09-10T18:26:44.501Z"),
    "assetId" : ObjectId("5b96b7645f2a8c0001530f61")
},
{
    "lsd" : {
      "$id" : ObjectId("lermen")
        }
    },
    "stateDate" : ISODate("2018-09-10T20:26:44.501Z"),
    "assetId" : ObjectId("5b96b7645f2a8c0001530f61")
},
{
    "lsd" : {
      "$id" : ObjectId("floripa")
    },
    "stateDate" : ISODate("2018-09-10T19:26:44.501Z"),
    "assetId" : ObjectId("5b96b7645f2a8c0001530f61")
}
]

我想获取最大“stateDate”,所以我需要从同一行(文档)获取 LSD。

预期结果:

{
    "lsd" : {
      "$id" : ObjectId("lermen")
    },
    "stateDate" : ISODate("2018-09-10T20:26:44.501Z")
}

我尝试过:

db.getCollection('assetState').aggregate([
{
        $group: {
            "_id": {"assetId": "$assetId"},
            "stateDate": {
                "$max": "$stateDate"
            },
            "lsd":  {$last: "$lsd"} // I tried change $max to $min and $last it din't work :(

        }
]);

结果:

{
    "lsd" : {
      "$id" : ObjectId("floripa")
    },
    "stateDate" : ISODate("2018-09-10T20:26:44.501Z")
}

非常感谢

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    试试这个查询

    db.getCollection('assetState').aggregate([
    {$sort:{"stateDate":-1}},
    ]).limit(1)
    

    【讨论】:

    • 有不同的资产。 (assetId) 这对我没有帮助。 Tks
    • 你想要哪个 lsd 数据??
    • 我想收到这个结果: { "lsd" : { "$id" : ObjectId("lermen") }, "stateDate" : ISODate("2018-09-10T20:26:44.501 Z") }
    【解决方案2】:

    您可以在$group 之前将$sort 降序,并使用$arrayElemAt 获取每个组的第一项

    db.getCollection('assetState').aggregate([
    { $sort: { stateDate: -1 } },
    { $group: { _id: { "assetId" : "$assetId" }, 
        states: { $push: "$$ROOT" }
        }
    },
    { $project: { "last_asset": { $arrayElemAt: [ "$states", 0 ] }, _id:0  } },
    ])
    

    结果:

    /* 1 */
    {
        "last_asset" : {
            "_id" : ObjectId("5db2b34fa1b70230bba9c4d9"),
            "lsd" : "denner",
            "stateDate" : ISODate("2018-09-10T17:26:44.501Z"),
            "assetId" : "5b96b7645f2b3c0101520s60"
        }
    }
    
    /* 2 */
    {
        "last_asset" : {
            "_id" : ObjectId("5db2b34fa1b70230bba9c4db"),
            "lsd" : "lermen",
            "stateDate" : ISODate("2018-09-10T20:26:44.501Z"),
            "assetId" : "5b96b7645f2a8c0001530f61"
        }
    }
    

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        我有这个按阶段分组:

        {
         _id: {"sourceOfEvent":"$sourceOfEvent","vehicleId":"$vehicleId"},
          maxTimeOfEvent: { $max: "$timeOfEvent" }
        }
        

        所以按 2 个字段分组,我使用最大值来获取 timeOfEvent 的最大值(这是一个日期)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-30
          • 1970-01-01
          • 2017-09-20
          • 2014-02-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多