按日期对数据进行分组并按日期时间排序 mongodb

时间:2021-04-24 11:11:20

标签: mongodb mongodb-query aggregation-framework

我在 mongodb 中有一个集合 events。我想根据 DATE (d-m-Y) GROUP 数据仅来自 event_time 字段,但之后 sort 基于 datetime (d-m-Y H:i:s)

我尝试的集合示例和解决方案是 here

现在,当我运行查询时,每次我得到 products 数组未排序/混洗,但我想得到 products 数组按 DATETIME (d-m-Y H:i:s) 排序,但外部结果将按 { 排序{1}}

PS:我也在生产中的 SORT 阶段之前使用 UNWIND 阶段来使用 SKIP 和 LIMIT 阶段。

1 个答案:

答案 0 :(得分:1)

问题的原因是$addToSet阶段的$group,它不会保留顺序,您可以尝试另一种方法,

  • $sortevent_time 降序排列
  • $groupevent_time 日期并推送所有 product_id
  • $reduce 删除所有重复的products,检查是否未找到产品,然后连接reduce的初始值
  • $sort by _id 表示按降序排列的日期
db.collection.aggregate([
  {
    $match: {
      "cuid": "608707",
      "event_name": "product_viewed"
    }
  },
  { $sort: { event_time: -1 } },
  {
    $group: {
      "_id": {
        "$dateToString": {
          "format": "%d-%m-%Y",
          "date": "$event_time"
        }
      },
      "products": { "$push": "$event_data.product_id" }
    }
  },
  {
    $addFields: {
      products: {
        $reduce: {
          input: "$products",
          initialValue: [],
          in: {
            $cond: [
              { $in: ["$$this", "$$value"] },
              "$$value",
              { $concatArrays: ["$$value", ["$$this"]] }
            ]
          }
        }
      }
    }
  },
  { $sort: { _id: -1 } }
])

Playground