【问题标题】:Count active users within last week?统计上周的活跃用户?
【发布时间】:2017-11-27 20:58:30
【问题描述】:

我有一个 mongoDB 数据库,其中包含由不同用户创建的对象。现在要跟踪用户保留和活跃用户,每周一次我想找出有多少不同的用户创建了一个新对象。

例如,假设对象是“Notes”。我如何才能有效地统计上周有多少不同的用户创建了笔记?

注:

{
   "user_id" : "..."
   "note"    : "..."
   "date"    : "..."
}

我使用猫鼬和 NodeJS。

【问题讨论】:

    标签: javascript node.js mongodb mongoose aggregation-framework


    【解决方案1】:

    假设集合附加到名为 Note 的模型并且 "date" 中的数据实际上是一个有效的 Date 对象,那么您实际上是在给定日期和聚合之间查询数据:

    // Work out days for start of tomorrow and one week before
    const oneDay = 1000 * 60 * 60 * 24,
          oneWeek = oneDay * 7;
    
    const d = Date.now();
    const lastDay  = d - ( d % oneDay ) + oneDay;
    const firstDay = lastDay - oneWeek;
    
    // Run the aggregation
    
    Note.aggregate([
      // $match is a query to select the week
      { "$match": { "date": { "$gte": new Date(firstday), "$lt": new Date(lastDay) } },
    
      // $group on the distinct users
      { "$group": { "_id": "$user_id" } },
    
      // $group to count the total
      { "$group": { "_id": null, "count": { "$sum": 1 } } }
    ],function(err, results) {
      // results in here
    })
    

    $match 是一个“查询”,就像任何其他 MongoDB 查询语句一样。您可以使用$gte$lt 运算符来表示介于两者之间的值的“范围”。这实际上是在不明确说明术语的情况下编写 AND 条件的简写方式。

    下一个阶段是$group,我们通过应用于分组键_id,将"user_id”字段数据“聚合”为“不同”值。分组键的输出是永远独一无二。

    最后一个阶段是另一个$group,这次分组键是null,而不是使用当前字段值。这意味着“对所有内容进行分组”,因此我们最终得到一行,它对 1 的值应用 $sum 操作以影响“计数”。

    这就是聚合“管道”的工作方式,因为每个“阶段”都流入下一个“阶段”。所以“Query” -> “Aggregate Distinct” -> “Aggregate Total” 是模式,其中最重要的要记住的是,每个阶段只能看到上一个阶段输出的数据的视图。

    一旦你掌握了这些概念,这很容易。

    【讨论】:

    • 哇!非常感谢您这么详尽的回答!我肯定会更多地研究聚合:)
    猜你喜欢
    • 1970-01-01
    • 2020-07-16
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多