按时间段对项目进行分组

时间:2014-12-02 17:03:24

标签: node.js mongodb mongoose

我有一个集合db.activities,其中每个项目都有一个dueDate。我需要以下列格式提供数据,基本上是今天和本周到期的活动清单:

{
  "today": [ 
    { _id: 1, name: "activity #1" ... }, 
    { _id: 2, name: "activity #2" ... } 
  ],
  "thisWeek": [ 
    { _id: 3, name: "activity #3" ... }
  ]
}

我设法通过简单地查询上周的活动作为平面列表,然后在客户端上使用javascript对它们进行分组来实现这一点,但我怀疑这是一个非常脏的解决方案,并希望在服务器上执行此操作。

1 个答案:

答案 0 :(得分:1)

查找mongo aggregation pipeline 您的聚合按日期匹配,按日期分组,也可以按日期排序/订​​购阶段。

缺乏数据方案,它将沿着

的路线
db.collection.aggregate([{ $match: {"duedate": { "$gte" : start_dt, "$lte" : end_dt} } ,
{ $group: {_id: "$duedate", recordid : "$_id" , name: "$name" }, 
{"$sort" : {"_id" : 1} } ]  );

如果你想要'所有'记录删除$ match或使用{ $match: {} }和find一样。

在我看来,你不能在一个命令中按天和周汇总。可以通过使用mongos $ dayOfWeek投射duedate来实现每周一次。

db.collection.aggregate([ 
{ $match: {"duedate": { "$gte" : start_dt, "$lte" : end_dt} } ,
{ $project :  { dayOfWeek: { $dayOfWeek: "$duedate" } },
{ $group: {_id: "$dayOfWeek", recordid : "$_id" , name: "$name" }, 
{"$sort" : {"_id" : 1} } ]  );

结帐http://docs.mongodb.org/manual/reference/operator/aggregation/dayOfWeek/