Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 统计上周内的活跃用户数?_Javascript_Node.js_Mongodb_Mongoose_Aggregation Framework - Fatal编程技术网

Javascript 统计上周内的活跃用户数?

Javascript 统计上周内的活跃用户数?,javascript,node.js,mongodb,mongoose,aggregation-framework,Javascript,Node.js,Mongodb,Mongoose,Aggregation Framework,我有一个mongoDB数据库,其中包含由不同用户创建的对象。现在,为了跟踪用户保留和活动用户,每周我想了解有多少不同的用户创建了一个新对象 例如,假设对象是“注释”。我如何才能有效地统计上周有多少不同的用户创建了一个便笺 注: { "user_id" : "..." "note" : "..." "date" : "..." } 我用猫鼬和野猫 假设集合附加到名为Note的模型,并且中的数据“date”实际上是一个有效的date对象,那么您基本上可以查询给定日期和

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

例如,假设对象是“注释”。我如何才能有效地统计上周有多少不同的用户创建了一个便笺

注:

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

我用猫鼬和野猫

假设集合附加到名为
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
})
与任何其他MongoDB查询语句一样,这是一个“查询”。可以使用and运算符表示介于两者之间的值的“范围”。这实际上是一种简写方式,用于编写和条件,而不明确说明术语

下一个阶段是通过应用到分组键(即
\u id
)来将
“user\u id
”字段数据“聚合”为“不同”值。分组键的输出总是唯一的

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

这就是聚合“管道”的工作方式,因为每个“阶段”都流入下一个“阶段”。因此,“查询”->“聚合不同”->“聚合总计”是模式,其中最重要的是要记住,每个阶段只能看到前一阶段输出的数据的视图


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

Wow!非常感谢您的详细回答!我肯定会进一步研究聚合:)