我有一个mongoDB数据库,其中包含由不同用户创建的对象。现在,为了跟踪用户保留和活跃用户,我想每周一次找出有多少不同的用户创建了一个新对象。
例如,假设对象是“Notes”。我怎样才能有效地计算出上周内有多少不同的用户创建了一个音符?
注意:
{
"user_id" : "..."
"note" : "..."
"date" : "..."
}
我使用mongoose和NodeJS。
答案 0 :(得分: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
,我们通过应用分组密钥"user_id
,将_id
“字段数据”汇总“为”不同“值。分组键的输出始终是唯一的。
最后一个阶段是另一个$group
,这次分组键是null
,而不是使用当前字段值。这意味着“将所有内容分组”,因此我们最终得到一行,对1
的值应用$sum
操作来实现“计数”。
这就是聚合“管道”的工作方式,因为每个“阶段”都流入下一个阶段。所以“查询” - > “Aggregate Distinct” - > “聚合总计”是一种模式,其中最重要的是要记住每个阶段只能看到从前一阶段输出的数据的视图。
一旦掌握了这些概念,这很容易。