繁体   English   中英

MongoDB聚合加入两个$group

[英]MongoDB aggregate join two $group

我有一个看起来像这样的模型:

{
tokens: [
{
  value: {
    type: String,
    required: true,
    unique: true,
  },
  origin: {
    type: String,
    default: 'Unknown',
  },
  grabbedAt: {
    type: Date,
    default: Date.now,
  },
},
], ...
}

现在我想按以下方式格式化数据,即返回过去 12 天日期的所有“令牌”,并按其来源分组,每天计数。

所以结果看起来像这样: [{ origin: 'Unknown', data: [0,1,2,...] }, { origin: 'origin2', data: [1,10,...] }]数据数组将保存过去 12 天获得的令牌数,从第一天到第 12 天。

我已经尝试过这样的事情:

Account.aggregate([
{ $unwind: '$tokens' },
{ $match: { 'tokens.grabbedAt': { $gte: beforeDate } } },
{
  $group: {
    _id: { origin: '$tokens.origin', date: '$tokens.grabbedAt' },
    count: { $sum: 1 },
  },
},
{ $project: { _id: 0, origin: '$_id.origin', date: '$_id.date', count: '$count' } },
{ $sort: { date: 1 } },
]);

但是使用此代码,每个日期和来源都包含多次。 那么我怎样才能“加入”或合并这两个 $groups 呢?

一种方法是按origin对令牌进行$unwind$group ,然后使用 3 个步骤创建 12 个所需日期的列表。 然后我们可以使用$set步骤来创建丢失的空日期对象。 现在我们可以$concatArrays用“人造”空天的实际测量值。 最后一部分只是分组和总结。

db.collection.aggregate([
  {$unwind: "$tokens"},
  {$match: {"tokens.grabbedAt": {$gte: beforeDate}}},
  {$sort: {"tokens.date": 1}},
  {
    $group: {
      _id: "$tokens.origin",
      res: {
        $push: {
          dateString: {$dateToString: {date: "$tokens.grabbedAt",
          format: "%Y-%m-%d"}},  count: 1
        }
      }
    }
  },
  {
    $addFields: {startDate: beforeDate, range: {$range: [0, 12, 1]}}
  },
  {
    $set: {
      dateStrings: {
        $map: {
          input: "$range",
          in: {
            dateString: {
              $dateToString: {
                date: {
                  $add: [
                    "$startDate",
                    {$multiply: ["$$this", 24, 60, 60, 1000]}
                  ]
                },
                format: "%Y-%m-%d"
              }
            },
            count: 0
          }
        }
      }
    }
  },
  {$project: {data: {$concatArrays: ["$dateStrings", "$res"]}}},
  {$unwind: "$data"},
  {$group: {
      _id: {origin: "$_id",  date: "$data.dateString"},
      count: {$sum: "$data.count"}
    }
  },
  {$group: {_id: "$_id.origin", date: {$push: "$count"}}}
])

操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM