【问题标题】:MongoDB Aggregate - Query to get most recent item in groupMongoDB Aggregate - 查询以获取组中的最新项目
【发布时间】:2017-07-08 14:39:03
【问题描述】:

鉴于此源数据:

{ "_id" : ObjectId("1"), "productID" : 1, "amount" : 1, "date" : ISODate("2017-02-01T00:00:00Z") }
{ "_id" : ObjectId("2"), "productID" : 2, "amount" : 2, "date" : ISODate("2017-02-01T00:00:00Z") }
{ "_id" : ObjectId("3"), "productID" : 3, "amount" : 3, "date" : ISODate("2017-02-01T00:00:00Z") }
{ "_id" : ObjectId("4"), "productID" : 4, "amount" : 4, "date" : ISODate("2017-02-01T00:00:00Z") }
{ "_id" : ObjectId("5"), "productID" : 1, "amount" : 11, "date" : ISODate("2017-02-02T00:00:00Z") }
{ "_id" : ObjectId("6"), "productID" : 2, "amount" : 22, "date" : ISODate("2017-02-02T00:00:00Z") }
{ "_id" : ObjectId("7"), "productID" : 2, "amount" : 222, "date" : ISODate("2017-02-03T00:00:00Z") }
{ "_id" : ObjectId("8"), "productID" : 3, "amount" : 33, "date" : ISODate("2017-02-03T00:00:00Z") }

我想获取每个产品的最新记录(键入productID)并打印出在productID 上排序的每个产品的该记录的完整行。所以我想要的上面的输出是:

{ "_id" : ObjectId("5"), "productID" : 1, "amount" : 11, "date" : ISODate("2017-02-02T00:00:00Z") }
{ "_id" : ObjectId("7"), "productID" : 2, "amount" : 222, "date" : ISODate("2017-02-03T00:00:00Z") }
{ "_id" : ObjectId("8"), "productID" : 3, "amount" : 33, "date" : ISODate("2017-02-03T00:00:00Z") }
{ "_id" : ObjectId("4"), "productID" : 4, "amount" : 4, "date" : ISODate("2017-02-01T00:00:00Z") }

我是 Mongo 的新手,遇到问题,设法解决了大部分问题,但无法删除每个产品的其他旧记录。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您可以使用$last$first 运算符。请注意,您应该在分组之前对文档进行排序:

    db.so.aggregate([
     { $sort: {productID:-1, date: -1} },
     { 
         $group: {
             _id : "$productID",
             date: {$last: "$date" },
             amount: {$first: "$amount" },
             id : {$first: "$_id"}
         }
     },
     { $project: { _id: "$id", productId: "$_id", date: 1, amount: 1 } }
    ])
    

    输出:

    {
        "_id" : 5,
        "productId" : 1,
        "date" : ISODate("2017-02-01T00:00:00.000Z"),
        "amount" : 11
    },
    {
        "_id" : 7,
        "productId" : 2,
        "date" : ISODate("2017-02-01T00:00:00.000Z"),
        "amount" : 222
    },
    {
        "_id" : 8,
        "productId" : 3,
        "date" : ISODate("2017-02-01T00:00:00.000Z"),
        "amount" : 33
    },
    {
        "_id" : 4,
        "productId" : 4,
        "date" : ISODate("2017-02-01T00:00:00.000Z"),
        "amount" : 4
    }
    

    【讨论】:

    • 感谢您的帮助。不过有一件事——我事先不知道完整的文档模式(即这是通用的)——所以我知道我将有一个固定的日期字段和一个 id 字段(日期、productID),但会有许多其他字段运行时未定义 - 如何在不指定对象的情况下返回对象的所有字段。
    猜你喜欢
    • 2016-07-29
    • 2020-02-22
    • 2014-10-30
    • 1970-01-01
    • 2023-03-09
    • 2021-09-11
    • 1970-01-01
    • 2016-06-01
    • 2015-10-07
    相关资源
    最近更新 更多