Group Mongo documents by id and get the latest document by timestamp

前端 未结 3 1534
孤独总比滥情好
孤独总比滥情好 2021-01-13 09:44

Imagine we have the following set of documents stored in mongodb:

{ \"fooId\" : \"1\", \"status\" : \"A\", \"timestamp\" : ISODate(\"2016-01-01T00:00:00.000Z         


        
3条回答
  •  情深已故
    2021-01-13 10:15

    You can use the $$ROOT system variable with the $last operator to return the last document.

    db.collectionName.aggregate([      
        { "$sort": { "timestamp": 1 } },     
        { "$group": { 
            "_id": "$fooId",   
            "last_doc": { "$last": "$$ROOT" } 
        }}
    ])
    

    Of course this will the last document for each group as a value of a field.

    {
            "_id" : "2",
            "doc" : {
                    "_id" : ObjectId("570e6df92f5bb4fcc8bb177e"),
                    "fooId" : "2",
                    "status" : "B",
                    "timestamp" : ISODate("2016-01-02T00:00:00Z")
            }
    }
    

    If you are not happy with that output then your best bet will be to add another $group stage to the pipeline when you simply return an array of those documents using the $push accumulator operator.

    db.collectionName.aggregate([      
        { "$sort": { "timestamp": 1 } },     
        { "$group": { 
            "_id": "$fooId",   
            "last_doc": { "$last": "$$ROOT" } 
        }},
        { "$group": { 
            "_id": null, 
            "result": { "$push": "$last_doc" } 
        }}
    
    ])
    

提交回复
热议问题