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条的统计数据
上面代码先是使用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的,如果不指定值,将默认过滤掉该字段,不会进入下级管道,如果非要画蛇添足,就会碰到跟作者一样的错误。
聚合管道详细介绍
管道操作符官方文档
本篇文章主要记录了在使用$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的,如果不指定值,将默认过滤掉该字段,不会进入下级管道,如果非要画蛇添足,就会碰到跟作者一样的错误。
聚合管道详细介绍
管道操作符官方文档
相关文章推荐
- 分享微信开发Html5轻游戏中的几个坑
- 如何在 Fedora 上安装 MongoDB 服务器
- PHP添加yaf xhprof mongodb 同理
- mongodb安装
- 如何在 Ubuntu 上安装 MongoDB
- 信息安全聚合 Sec-News 的重构之路
- perl操作MongoDB报错undefined symbol: HeUTF8解决方法
- C#中使用1.7版本驱动操作MongoDB简单例子
- 使用zabbix监控mongodb的方法
- Node.js的MongoDB驱动Mongoose基本使用教程
- MongoDB系列教程(四):设置用户访问权限
- node.js连接mongoDB数据库 快速搭建自己的web服务
- php实现的mongodb操作类实例
- 解决mongodb在ubuntu下启动失败,提示couldn‘t remove fs lock errno:9 Bad file descriptor的错误
- 在PostgreSQL的基础上创建一个MongoDB的副本的教程
- 关于mongoose连接mongodb重复访问报错的解决办法
- java操作mongodb示例分享
- php对mongodb的扩展(初出茅庐)
- 作为PHP程序员应该了解MongoDB的五件事
- 基于MySQL到MongoDB简易对照表的详解