Skip to content

Instantly share code, notes, and snippets.

@bertrandmartel
Last active February 23, 2017 05:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bertrandmartel/a8b90ff77eede35f370d2988f7bfc84a to your computer and use it in GitHub Desktop.
Save bertrandmartel/a8b90ff77eede35f370d2988f7bfc84a to your computer and use it in GitHub Desktop.
Aggregation sort & group with mongodb

Aggregation sort & group

Input

db.test.drop();

db.test.insert([{
    id: 1,
    userId: 1,
    review: "only one review",
    dateCreated: ISODate("2017-02-23 02:35:11.420Z")
}, {
    id: 3,
    anonId: 1,
    review: "second entered",
    dateCreated: ISODate("2017-02-23 02:41:42.300Z")
}, {
    id: 2,
    userId: 2,
    review: "fist enterd",
    dateCreated: ISODate("2017-02-23 02:36:32.150Z")
}, {
    id: 5,
    userId: 3,
    review: "fist enterd121212",
    dateCreated: ISODate("2017-02-23 02:36:32.150Z")
}])

Aggregation

db.test.aggregate([{
    $sort: {
        "dateCreated": -1
    }
}, {
    $project: {
        ref: {
            $cond: {
                if: { $gt: ["$userId", null] },
                then: "$userId",
                else: "$anonId"
            }
        },
        document: "$$ROOT"
    }
}, {
    $group: {
        _id: "$ref",
        document: {
            "$first": "$document"
        }
    }
}])

Output

{ "_id" : 3, "document" : { "_id" : ObjectId("58ae6bf93aa71d40f8906efe"), "id" : 5, "userId" : 3, "review" : "fist enterd121212", "dateCreated" : ISODate("2017-02-23T02:36:32.150Z") } }
{ "_id" : 2, "document" : { "_id" : ObjectId("58ae6bf93aa71d40f8906efd"), "id" : 2, "userId" : 2, "review" : "fist enterd", "dateCreated" : ISODate("2017-02-23T02:36:32.150Z") } }
{ "_id" : 1, "document" : { "_id" : ObjectId("58ae6bf93aa71d40f8906efc"), "id" : 3, "anonId" : 1, "review" : "second entered", "dateCreated" : ISODate("2017-02-23T02:41:42.300Z") } }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment