MongoDB增加计算列并修改数据实践笔记
创始人
2025-05-31 19:42:33

1. 增加、删除列

通过聚合,使用操作符$set增加列;修改结果,需要使用save()。

db.getCollection('trade2019').aggregate([{'$set':{'sn': {'$substr':['$cardasn',0,6]}}}]).forEach(function(x){db.trade2019.save(x)    })

直接通过操作符$unset删除列,修改文档。

db.getCollection('trade2019').update({},{'$unset': {'sn':1 } },{'multi':true}
)

2. 增加计算列

Aggregation聚合操作中的$addFields添加新字段操作,具体而言,通过向输出文档添加新字段,该输出文档既包含输入文档中的现有字段,又包含新添加的字段。

语法: { $addFields: {: , … } }

注意点:【如果新字段的名称与现有字段名称(包括_id)相同$addFields,则使用指定表达式的值覆盖该字段的现有值。

功能描述:
计算:(latestdays - densitymean)/densitymean,当densitymean=0时,结果赋值为0。

db.getCollection('customerfeature_dev').aggregate([{'$addFields':{'densitymeandiff':{'$cond':[{'$gt':['$densitymean',0]},{'$divide':[{'$subtract':['$latestdays','$densitymean']},'$densitymean']},0]}}},{'$project':{'_id':0,'densitymean':1,'latestdays':1,'densitymeandiff':1}}],{'allowDiskUse':true})

在这里插入图片描述
注意:这种方法增加计算列,并没有保存到原有文档,只是临时存在当前聚合管道中。如果要保存新增内容,需要另存输出到新的文档中,详见后续内容。

其中,在MongoDB数据库中“加减乘除”运算,又称为 数学表达式(mathematical expression;或算术表达式),主要用于操作数值。

2.1.$add操作符(+)

语法及功能介绍
$add 操作符主要用于将一组数字相加;也可以用于在指定时间上添加一定的时间间隔。时间间隔单位为milliseconds(毫秒)。

$add操作符的语法:

{ $add: [ ,\ , … ] }
这个操作符接受一个或多个表达式作为参数,将这些表达式相加。

案例演示:

db.getCollection('customerfeature_dev').aggregate([{'$addFields':{'densitymeandiff':{'$add':['$latestdays','$densitymean']}}},{'$project':{'_id':0,'densitymean':1,'latestdays':1,'densitymeandiff':1}}],{'allowDiskUse':true})

在这里插入图片描述

2.2.$subtract操作符(-)

语法及功能介绍
$subtract操作符是$add的逆运算,它可以计算两个数值的差值;可以计算 2个日期时间的间隔;还可以在指定日期上减去指定的时间间隔。关于时间的计算,参数的单位都是milliseconds(毫秒)。

{$subtract: [ , ] }
接受两个表达式作为参数,用第一个表达式减去第二个表达式作为结果。

2.3.$multiply操作符(*)

语法:
{ $multiply: [ , , … ] }
接受一个或多个表达式,并将它们相乘。

2.4.$divide操作符(/)

语法:
{ $divide: [ , ] }
接受两个表达式,将第一个表达式除以第二个表达式的商作为结果。

2.5 求余 运算($mod)

语法:
{ $mod: [ , ] }
接受两个表达式,将第一个表达式除以第二个表达式得到的余数作为结果。

案例演示

db.getCollection('customerfeature_dev').aggregate([{'$match':{'densitymean':{'$gt':0}}},{'$addFields':{'densitymeandiff':{'$mod':['$latestdays','$densitymean']}}},{'$project':{'_id':0,'densitymean':1,'latestdays':1,'densitymeandiff':1}}],{'allowDiskUse':true})

在这里插入图片描述

3.案例分析

功能描述:
客户特征文档(表):customerfeature_dev
选定客户文档(表):carduser_id
文档(表)关联关键字:carduser_id
关联查询结果输出到新的文档(表):cfd2019

涉及到函数、运算符:
聚合:aggregate
获取指定字段:$project
文档(表)关联:$lookup
将数组拆分为单独的文档:$unwind
增加计算列:$addFields

db.getCollection('customerfeature_dev').aggregate([{'$project':{'carduser_id':1,'balance':1,'oil_id':1,'occurtime':1,'lasttradecount':1,'accsumamount':1,'accpvolumn':1,'accpamount':1,'accgoods':1,'accdvolumn':1,'accdamount':1,'accgvolumn':1,'accgamount':1,'volumn':1,'pearson':1,'IntervalSlope':1,'IntervalStd':1,'dayvolSlope':1,'dayvolStd':1,'abnormal':1,'IntervalStd':1,'skewness':1,'lateststatus':1,'latestday':1,'latestdays':1,'volumnrate':1,'daysnum':1,'densitymean':1,'org_rate':1,'recharge_days':1}},{'$lookup':{'from': 'carduser_id','localField': 'carduser_id','foreignField': 'carduser_id','as': 'newdata'       }},{'$unwind':'$newdata'},{'$addFields':{'densitymeandiff':{'$cond':[{'$gt':['$densitymean',0]},{'$divide':[{'$subtract':['$latestdays','$densitymean']},'$densitymean']},0]}}},{'$project':{'newdata':0}},{'$out':{'db':'ccm','coll':'cfd2019'}}   ],{'allowDiskUse':true})

操作首先使用$lookup阶段按下面的操作首先使用$lookup阶段按item字段连接两个集合,然后使用$replaceRoot中的$mergeObjects从项和订单中合并已连接的文档:字段连接两个集合,然后使用$replaceRoot中的$mergeObjects从项和订单中合并已连接的文档:

聚合求合计:
通过聚合分组,没有分组字段(null),则计算出文档计量数量。

db.getCollection('cfd2019').aggregate([{'$match':{'$or':[{'lateststatus':{'$lte':2}, 'abnormal':1, 'latestday':{'$lt':139}},{'lateststatus':3, 'abnormal':1}]}},{'$group':{'_id':null,'count':{'$sum':1}}}],{'allowDiskUse':true})

参考:

肖永威. MongoDB高级查询多级分组聚合及时间计算应用实践案例. CSDN博客. 2021.10.30
肖永威. MongoDB聚合使用表达式运算符(函数)分组按条件计数统计案例一则. CSDN博客. 2021-11-20

相关内容

热门资讯

飞信手机多方通话怎么用(飞信手... 本篇文章极速百科给大家谈谈飞信手机多方通话怎么用,以及飞信手机好友收费吗对应的知识点,希望对各位有所...
会计中的流动资产包括哪些,下列... 会计中的流动资产包括哪些目录会计中的流动资产包括哪些下列会计科目中,属于流动资产的是(  )。会计基...
旺旺碎冰冰是什么梗的简单介绍 ... 本篇文章极速百科给大家谈谈旺旺碎冰冰是什么梗,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站...
怎样给芭比做衣服,给芭比娃娃做... 怎样给芭比做衣服目录怎样给芭比做衣服给芭比娃娃做衣服怎么做不用缝怎样帮芭比娃娃做衣服怎样给芭比做衣服...
如何区分,植物油,矿物油,白油... 本篇文章极速百科给大家谈谈如何区分,植物油,矿物油,白油,液蜡?,以及怎么区别植物油和矿物油对应的知...
武汉空气为什么那么差(为什么武... 本篇文章极速百科给大家谈谈武汉空气为什么那么差,以及为什么武汉空气质量这么差对应的知识点,希望对各位...
美国4大全尺寸皮卡之一,性能不... 本篇文章极速百科给大家谈谈美国4大全尺寸皮卡之一,性能不输福特猛禽,通用塞拉...,以及美国皮卡车品...
skp是啥(SKP是啥格式) ... 本篇文章极速百科给大家谈谈skp是啥,以及SKP是啥格式对应的知识点,希望对各位有所帮助,不要忘了收...
C1的教练资格证要怎么考,c1... C1的教练资格证要怎么考目录C1的教练资格证要怎么考c1教练资格证怎么考取怎么考c1汽车教练资格证?...
经典一词中的典是什么意思,经典... 经典一词中的典是什么意思目录经典一词中的典是什么意思经典的典是什么意思经典的典是什么意思?请问金典和...
什么叫做商,什么是商? 极速百... 什么叫做商目录什么叫做商什么是商?除法算式里的商是什么意思什么是商?什么叫做商 “商”的含义可...
柯南伦敦告白小兰是哪一集,名侦... 柯南伦敦告白小兰是哪一集目录柯南伦敦告白小兰是哪一集名侦探柯南哪集新一在伦敦向 小兰表白?名侦探柯南...
9个复韵母是哪9个韵母,六个单... 9个复韵母是哪9个韵母目录9个复韵母是哪9个韵母六个单韵母,九个复韵母,九个鼻韵母和十六个整体认读音...
如何去除猫尿味,怎样才能去除猫... 如何去除猫尿味目录如何去除猫尿味怎样才能去除猫尿的味道???并且让猫猫不会再乱尿?帮帮忙,如何去除猫...
吉他有多少和弦都是什么,吉他有... 吉他有多少和弦都是什么目录吉他有多少和弦都是什么吉他有多少和弦 都是什么吉他一共有多少和弦啊?听别人...
网上怎么订购好利来蛋糕(如何订... 本篇文章极速百科给大家谈谈网上怎么订购好利来蛋糕,以及如何订购好利来蛋糕对应的知识点,希望对各位有所...
杭州重点高中有哪些,杭州有哪些... 杭州重点高中有哪些目录杭州重点高中有哪些杭州有哪些重点高中杭州哪所高中最好杭州重点高中有哪些 ...
女为悦己者容意思,士为知己者死... 女为悦己者容意思目录女为悦己者容意思士为知己者死,女为悦己者容.是什么意思.女人无需为悦己者容悦人不...
北戴河是海吗 极速百科网 极速... 北戴河是海吗目录北戴河是海吗北戴河是海吗 北戴河是海。北戴河古称渝水,清光绪年间,因沙河流经戴...
外婆是什么样的关系,姥姥与我的... 外婆是什么样的关系目录外婆是什么样的关系姥姥与我的关系叫什么关系姥姥是指外婆还是奶奶??我与外婆是什...
头歌--第1关:Linux文件... 任务描述 假设系统中存在一个文件File,修改该文件的权限,根据实际需求...
【Spring从成神到升仙系列... 👏作者简介:大家好,我是爱敲代码的小黄,独...
梦见蜈蚣是什么意思,做梦梦见蜈... 梦见蜈蚣是什么意思目录梦见蜈蚣是什么意思做梦梦见蜈蚣什么意思梦见蜈蚣是什么意思,哪里有解释啊梦见蜈蚣...
小区车位比一般是多少,车库配比... 小区车位比一般是多少目录小区车位比一般是多少车库配比是什么小区总户数8200,总车位是1450个,配...
车锁上的lock什么意思,汽车... 车锁上的lock什么意思目录车锁上的lock什么意思汽车上lock是什么意思?车子上“lock标志”...
kirin710是什么处理器,... kirin710是什么处理器目录kirin710是什么处理器海思kirin710是高通多少?骁龙71...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
跟着文档制作cocos第一个游... 背景 近期打算学习一下cocos creator,想着开发自己的游戏,是...
乌干达是什么梗,网络语乌干达什... 乌干达是什么梗目录乌干达是什么梗网络语乌干达什么意思?乌干达是什么梗乌干达是什么梗乌干达是什么梗 ...
车载电子狗怎么用,怎样使用电子... 车载电子狗怎么用目录车载电子狗怎么用怎样使用电子狗怎么使用电子狗求简答车载电子狗怎么使用车载电子狗怎...