先进行过滤,再分组
1、实例:db.getCollection('UpMsgItem').aggregate( [ {$match : { createTime : {$gt : 1513568964539, $lte : 1516160964542 }, wxAppId : "wx8bd8a617c9ae66ed" }}, {$group : {_id : "$wxOpenId"}} ])
2、解释:
match进行过滤,这里利用createTime、wxAppId两个字段进行过滤。过滤之后的数据,根据_id进行分组。$group对应的值就是分组以后返回的数据,可以在里面进行聚合操作。多个字段进行分组
1、实例:db.getCollection('UpMsgItem').aggregate( [ {$match : { createTime : {$gt : 1519613221561, $lte : 1519699621562 }}}, { $group : {"_id": { "wxOpenId" : "$wxOpenId", "wxAppId": "$wxAppId"}} } ])
计算分组以后的记录数:
1、实例:db.getCollection('UpMsgItem').aggregate( [ {$match : { createTime : {$gt : 1507508412000, $lte : 1522881012000 }}}, { $group : {"_id": { "wxOpenId" : "$wxOpenId", "wxAppId": "$wxAppId"}} } ]).map(function(record, index){ print(index); });
先过滤,在进行分组、聚合操作:
1、实例:db.getCollection('UpMsgItem').aggregate( [ {$match : { createTime : {$gt : 1513568964539, $lte : 1516160964542 }, wxAppId : "wx8bd8a617c9ae66ed" }}, {$group : {_id : "$wxOpenId", sumCreateTime: {$sum: "$createTime"}}} ])
2、解释:
这里的sumCreateTime就是聚合后的结果,对createTime字段进行聚合。- group聚合操作:
$group:可以对分组的数据执行如下的表达式计算:
$sum:计算总和。
$avg:计算平均值。
$min:根据分组,获取集合中所有文档对应值得最小值。
$max:根据分组,获取集合中所有文档对应值得最大值。
$push:将指定的表达式的值添加到一个数组中。
$addToSet:将表达式的值添加到一个集合中(无重复值)。
$first:返回每组第一个文档,如果有排序,按照排序,如果没有按照默认的存储的顺序的第一个文档。
$last:返回每组最后一个文档,如果有排序,按照排序,如果没有按照默认的存储的顺序的最后个文档。
同时使用大于、小于查询
db.getCollection('UpMsgItem').find({ "createTime" : {$gt : 1519556225560, $lt : 1519642625562}, "ea" : '2' }).count();
查看字段是否存在
db.getCollection('log_original').find({ exception : { $exists: true }})
两个字段之间比较
{ $where : "this.updateTime > this.createTime"}
与操作:
db.getCollection('DownMsgItem').find({createTime : {$lte :1528646400000, $gte : 1529251200000}})
- 增加索引
db.getCollection('customer_evaluation_statistics').ensureIndex({"fsEa":1, "appId":1, "createTime" : 1})
注意点
1、mongo的update、findAndModify操作,如果没有set字段,会进行全量覆盖