MongoDb Group BY MAX дата и получить поле из этого документа - PullRequest
1 голос
/ 23 октября 2019

Смотри мой проблемный хе-хе. Я не знаю, как я могу это сделать. Есть много assetState 1..n Я хотел бы сделать агрегацию для получения последней группы состояний активов по активам.

Коллекция Монго: 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")
}

Большое спасибо

Ответы [ 3 ]

0 голосов
/ 25 октября 2019

вы можете $sort по убыванию до $group и получить первый элемент каждой группы с $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"
    }
}
0 голосов
/ 29 октября 2019

Вы можете использовать $ unwind (агрегат) https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/

0 голосов
/ 23 октября 2019

Попробуйте этот запрос

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