mongodb之聚合管道操作符的错误用法之$project(一)

关于mongodb聚合管道,网上的文章很多,介绍的也特别详细,这里就不再多做介绍,该系列文章只是记录了一些作者自己曾经犯的一些错误,以对自己起到警示作用,也希望对犯同样错误的同学有所帮助,有些错误可能很低级,但是确实不容易忽视,它是对官方文档没有仔细阅读,然后自以为是所犯下的,因为自以为是,陷入思维定式,错误还很难排除,所以就产生了该系列文章。

本篇文章主要记录了在使用$project时作者曾经所犯过的一个错误。

本篇文章采用了一个网站点击量统计的数据模型,如下所示

{

    _id:Object,

    url:String,

    userIP:String,

    userName:String

    recordTime:Number

}

本篇文章用到的聚合管道操作符简要介绍:

$project 用于字段的生成,删除,重命名(也可以看成是生成),

$match 用于过滤操作,一般用在聚合管道的前边,把符合筛选条件的数据传入下一级,

$group 对数据进行分组,用于分组统计非常有用,

$skip 跳过的文档的数目

$limit 限制通过管道的文档的数目,结合$skip实现分页查询

业务需求:统计各个页面某段时间内的点击量,并获取第11至20条的统计数据

db.collection.aggregate(
    {
        $matcth : {recordTime : {$gte : startTime, $lt : endTime}}
    },
    {
        $group : {
            _id : '$url',
            visitCount : {$sum : 1}
        }
    },
    {$project : {_id : 0, url : '$url', visitCount : 1}},
    {$skip : 10},
    {$limit : 10}
)

上面代码先是使用match对数据进行了匹配过滤,只有记录时间在startTime和endTime之间的数据才会通过管道,进入下一级,然后用group对上级过来的数据进行了分组统计,

此时通过group的字段只剩两个即_id 和visitCount 然后进入project ,该操作符删除了_id字段,新建了url字段,并把_id的值赋给了该字段,并选择visitCount字段进入下一级管道。

在实际工作中作者犯了一个很低级的错误,出在project阶段,官方文档数_id字段如果不指定将默认显示,当然也可以指定1或true不会报错,但实在是没有必要,如果赋值为0或false则_id字段将不会通过管道进入下一级,其他字段指定为1或true将会进入下一级管道,作者当时没有好好看文档,就想当然的认为其他字段指定为0或false将会跟_id字段一样,结果报了“exception: The top-level _id field is the only field currently supported for exclusion“的错误,困扰了我一个上午,最后又把官方文档读了一遍才发现,其他字段是不能指定为0或false的,如果不指定值,将默认过滤掉该字段,不会进入下级管道,如果非要画蛇添足,就会碰到跟作者一样的错误。


聚合管道详细介绍

管道操作符官方文档

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值