您的位置:首页 > 数据库 > Mongodb

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

2016-06-29 22:26 525 查看
关于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的,如果不指定值,将默认过滤掉该字段,不会进入下级管道,如果非要画蛇添足,就会碰到跟作者一样的错误。

聚合管道详细介绍

管道操作符官方文档
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mongodb 聚合管道