资讯专栏INFORMATION COLUMN

mongodb pipeline 简单说明

JerryWangSAP / 3337人阅读

摘要:基本说明作用对的进行运算,筛选,截取,排序操作语法是要执行的聚合说明格式类型或包含多个的列表或,会顺序执行列表里面的操作语法操作符操作提供了非常多的操作符,这里只选取常用的几个进行说明常用操作重命名及增加,删除字段例子保留字段不要字段常用以

基本说明 作用

对mongodb的collection进行运算,筛选,截取,排序操作

语法
 db.collection.aggregate(pipeline)

pipeline是要执行的聚合说明

pipeline 格式

dict类型或包含多个dict的列表:{}[{},…,{}],mongodb会顺序执行列表里面的操作
pipeline 语法:{$操作符:{操作}}
mongodb提供了非常多的操作符,这里只选取常用的几个进行说明

常用操作 $project

重命名及增加,删除字段

例子:

db.collection.aggregate({"$project": {
    key1:1, // 保留key1字段
    key2:0, //不要key2字段(常用以去掉"_id",因为"_id"会默认被包含)
    keyalias:"$key3"//将key3字段重命名为keyalias
    }}
$match

过滤筛选操作
match语法和db.collection.find()语法相同

$limit

现在数据条数
如: db.collection.aggregate({$limit:5}) : 只返回最多5条数据

$skip

从数据集合开始跳过n条数据
语法和$limit 一样,n为正整数

$unwind

将数组元素拆分成独立字段
语法{$unwind:"$字段名"},该字段的值必需是数组

例子:
假设collection 原版的数据是:

{_id:xxxxxxx,
 key1: [
    {subk1: value,
     subk2: value
    },
    {subk3: value,
     subk2: value
    }],
 key2: value,
 key3: value
}

通过db.collection.aggregate({$unwind:"$key1"})后:

 {result:[
    {
        _id: xxxxxxx,
        key1: {subk1: value, subk2: value},
        key2: value,
        key3:value
    },
    {
        _id: xxxxxxx
        key1: {subk3: value, subk2: value},
        key3: value
    }
    ]
 }
$group

根据指定字段值进行分组,可以包含算数类型的表达式操作符

例子:
假设collection数据为

[{
    _id: xxxxxxx,
    key1: v1,
    key2: 2,
 },
 {
    _id: xxxxxxxx,
    key1: v2,
    key2: 5
 },
 {
    _id: xxxxxxx,
    key1: v1,
    key2: 7
 },
]

db.collection.aggregate({$group:{_id:"$key1", key2sum:{$sum :"$key2"}}})

结果为:

{result:[
    {key1: v1, key2sum: 9},
    {key1: v2, key2sum: 5}
 ]
}
$sort

对结果进行排序**,语法和db.collection.find().sort()语法一致
{$sort:{key1: -1, key2:1}}: key1值降序,key2值升序

常用操作示例 取某一段范围
pipeline = {$match:{ts:{$gte: 100000, $lt:120000}}}

筛选出ts在[100000, 120000] 之间的数据

去掉值为null的数据
pipeline = {$match:{key1:"$ne":null}}

去掉key1为null的数据

多个操作组合示例
 pipeline = [{"$project":{"minu": 1, "_id": 0, "t": 1, "r": 1}},
    {"$unwind": "$minu"},
    {"$match": {"minu": {"$ne": None}}},
    {"$project": {"r": 1, "trans_count": "$minu.k", "ts": {"$add": ["$t", "$minu.t"]}}},
    {"$match": {"ts": {"$gte": 1457059140, "$lt": 1457060040}}},
    {"$project": {"trans_count": 1, "id": 0, "r": 1}},
    {"$group": {"trans_count": {"$sum": "$trans_count"}, "id": "$r"}},
    {"$project": {"trans_count": 1, "id": 0, "ret_code": "$id"}},
    {"$sort": {"trans_count": -1, "ret_code": 1}}]

mongodb会顺序执行以下内容:

获取minu, t, r 字段的内容, 去掉_id字段

分解minu的数据

去掉minu字段为null的数据

将保留r字段, minu.k重命名为trans_count, ts为t和minu.t的和

获取ts在[1457059140, 1457060040]之间的数据

获取trans_count, r 字段

按照r字段的值分组,同一个r值得trans_count相加(id的值是r字段的内容)

保留trans_count字段,_id重命名为ret_code

根据trans_count降序,ret_code升序排列

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18820.html

相关文章

  • mongoDB查询进阶】聚合管道(一) -- 初识

    摘要:小结是聚合管道查询使用的方法,参数是数组,每个数组元素就是一个,中运用操作符对数据进行处理后再交由下一个,直到没有下个,就输出最终的结果,而数据的处理则是通过使用操作符,本文先简单介绍了一下有哪些常用的操作符,下一篇再详细说明。 前言:一般查询可以通过find方法,但如果是比较复杂的查询或者数据统计的话,find可能就无能为力了,这时也许你需要的是aggregate. 什么是聚合管道(...

    MSchumi 评论0 收藏0
  • 基于nodejs将mongodb的数据实时同步到elasticsearch

    摘要:一前言因公司需要选用做全文检索,持久化存储选用的是,但是希望里面的数据发生改变可以实时同步到上,一开始主要使用的版本,可以搞定这个问题。或者修改中的某一条数据,也会实时同步到中。如何把的主文档和附件信息都同步到中利用的来实现。 一、前言 因公司需要选用elasticsearch做全文检索,持久化存储选用的是mongodb,但是希望mongodb里面的数据发生改变可以实时同步到elast...

    miya 评论0 收藏0
  • scrapy学习笔记(三):使用item与pipeline保存数据

    摘要:最近真是忙的吐血。。。上篇写的是直接在爬虫中使用,这样不是很好,下使用才是正经方法。 最近真是忙的吐血。。。 上篇写的是直接在爬虫中使用mongodb,这样不是很好,scrapy下使用item才是正经方法。在item中定义需要保存的内容,然后在pipeline处理item,爬虫流程就成了这样: 抓取 --> 按item规则收集需要数据 -->使用pipeline处理(存储等) 定义it...

    13651657101 评论0 收藏0
  • MongoDB:aggregate与aggregateCursor

    摘要:环境使用可以实现较为复杂的数据聚合操作,例如汇总去重汇总分组统计等。返回结果为数组,需要注意数据大小不能超过。的返回结果为游标,可循环取数。 环境mongos 3.0.14 aggregate 使用 aggregate 可以实现较为复杂的数据聚合操作,例如 汇总(count)、去重汇总(distinct count)、分组统计(group having)等。 aggregate 返回结...

    goji 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<