MongoDB聚合查询

标签 mongodb output aggregation-framework

在 MongoDB 中我有一个集合:

Statistics
{
    UserID:  int          //User id
    Url: string           //Url
    Clicks: [DateTime]    //A time array    
}

当用户单击 URL 时,在 Clicks 数组中添加单击日期的日期。我的问题是如何编写聚合查询,例如获取从 [date1] 到 [date2] 的点击次数并按 UserID 分组?如何将, 输出到文件?

谢谢!

最佳答案

假设您有这样的数据(请参阅底部如何生成此数据):

{ "_id": ObjectId("508ab0e27bb16229520c9561"), "userid": 0, "url": "", "clickDate": ISODate("20120101T12:01:00Z") }
{ "_id": ObjectId("508ab0e27bb16229520c9562"), "userid": 1, "url": "", "clickDate": ISODate("20120202T12:01:00Z") }
{ "_id": ObjectId("508ab0e27bb16229520c9563"), "userid": 2, "url": "", "clickDate": ISODate("20120303T12:01:00Z") }
{ "_id": ObjectId("508ab0e27bb16229520c9564"), "userid": 3, "url": "", "clickDate": ISODate("20120404T11:01:00Z") }
{ "_id": ObjectId("508ab0e27bb16229520c9565"), "userid": 4, "url": "", "clickDate": ISODate("20120505T11:01:00Z") }

这是聚合函数:

db.test.aggregate( {
                      $match: {
                        clickDate: { $gte: new Date(2012,8,30,12,0,0) }
                      }
                    },
                    {
                      $group: {
                        _id: "$userid",
                        clicks: { $sum: 1 }
                      }
                    }
                 );

确保$match位于$group之前。请参阅early filtering .

结果:

{
  "result": [
    { "_id": 8,
      "clicks": 1
    },
    { "_id": 7,
      "clicks": 2
    },
    { "_id": 6,
      "clicks": 2
    },
    { "_id": 3,
      "clicks": 2
    },
    { "_id": 2,
      "clicks": 2
    },
    { "_id": 1,
      "clicks": 2
    },
    { "_id": 4,
      "clicks": 2
    },
    { "_id": 0,
      "clicks": 2
    },
    { "_id": 5,
      "clicks": 2
    },
    { "_id": 9,
      "clicks": 1
    }
  ],
  "ok": 1
}

数据是通过此循环生成的:

// d=days, m=months (for ISODate months start from 0, while days from 1) 
for (var i = 0, d = 1, m = 0, id = 0; i < 100; i++, d++, m++, id++) {
  if (d > 30){
    d=1;
  }
  if (m > 10){
    m=0;
  }
  if (id > 9){
    id=0;
  }
  db.test.insert({userid: id, url:"", clickDate: new Date(2012,m,d,12,1,0)});
}

关于MongoDB聚合查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13087657/

相关文章:

C:在C中执行和输出shell命令

c - 通过 C 中的用户定义函数打印随机二维数组

c - 如何在没有填充位的情况下用 C 语言输出二进制文件

mongodb - 以聚合顺序使用 $$ROOT

javascript - 如何求和数据库中的字段

mongodb - 如何计算 MongoDB 中嵌入文档中的字段数

mongodb - 向 MongoDB 集合哈希字段添加索引

mysql - 将包含 sum 和 group_concat 的 mysql 查询转换为 mongodb 查询

mongodb - 如何将 Mongodb Atlas 连接到 Spring

java - 使用 Java 驱动程序的 MongoDB 文本索引