通过聚合,使用操作符$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}
)
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;或算术表达式),主要用于操作数值。
语法及功能介绍
$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})
语法及功能介绍
$subtract操作符是$add的逆运算,它可以计算两个数值的差值;可以计算 2个日期时间的间隔;还可以在指定日期上减去指定的时间间隔。关于时间的计算,参数的单位都是milliseconds(毫秒)。
{$subtract: [
接受两个表达式作为参数,用第一个表达式减去第二个表达式作为结果。
语法:
{ $multiply: [
接受一个或多个表达式,并将它们相乘。
语法:
{ $divide: [
接受两个表达式,将第一个表达式除以第二个表达式的商作为结果。
语法:
{ $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})
功能描述:
客户特征文档(表):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