根据一列对文档进行分组,然后从每个组中选择一个文档作为另一列的最大值

时间:2018-08-02 17:58:32

标签: mongodb

我有一张时间表。我想获取每个商店的最新计划时间表的整个文档。我对选择此类文档的过程的假设是:

  • DIVISION STORE_ID
  • 进行过滤
  • DIVISION STORE_ID
  • 分组
  • 为每个组选择 SCHEDULED_INSTALL_DATE 的最大值
  • 返回每个组的整个文档

但是,我在网上发现的多个尝试的汇总函数都失败了。

例如,此代码返回具有相同 DIVISION STORE_ID 的多个值。我认为这是因为它是按 SCHEDULED_INSTALL_DATE

分组的
[
    { $match : {DIVISION: divisionId, STORE_ID:{$in :storeIds}} },
    { $sort : { SCHEDULED_INSTALL_DATE : -1 } },
    { $group: {
        _id : "$_id",
        STORE_ID: {$first:"$STORE_ID"},
        DIVISION: {$first:"$DIVISION"},
        SCHEDULED_INSTALL_DATE : {$first:"$SCHEDULED_INSTALL_DATE "},
    }},
]

该元素不起作用,因为未对推送的文档数组进行排序,因此选择第0个元素不是正确的元素

[
    { $match : {DIVISION: divisionId, STORE_ID:{$in :storeIds}} },
    { $sort : { SCHEDULED_INSTALL_DATE : -1 } },
    { $group: {
        _id : "$_id",
        STORE_ID: {$first:"$STORE_ID"},
        DIVISION: {$first:"$DIVISION"},
        schedules: { $push : "$$ROOT" }
    }},
    { $replaceRoot: { newRoot: { $arrayElemAt: ["$schedules", 0] } },
]

如何通过单个MongoDB查询实现我的目标?

我表中的数据示例

{
"_id":"abc123",
"DIVISION":"1",
"SCHEDULED_INSTALL_DATE":"2018-08-03T07:00:00.000Z",
"INSTALL_TYPE":"configInstall",
"STORE_ID":"2",
"VPOS_VERSION":"1.1",
"STATUS":"0"
}

0 个答案:

没有答案