首页 > 数据库 >mongoDB-使用总结($group 、$unwind、$cond等)

mongoDB-使用总结($group 、$unwind、$cond等)

时间:2023-12-22 11:56:20浏览次数:30  
标签:unwind pnum mongoDB sum 2023 time group data id

1.按年分库表联合查询

db.collection_2023_3.aggregate(
  {$set:{_id:'2023_3'}},
  {$unionWith:{coll:'collection_2023_4',pipeline:[ { $set: { _id: "2023_4" } } ]}}
)

 

2.多字段分组

{
    $group: {
        _id: {
            data_time: '$data_time',
            isoWeek: '$isoWeek'
        },
        sum_pnum: {
            $sum: '$pnum'
        }
    }
}

多字段分组时要给字段起别名,当第二次分组时再用到第一次分组的字段时,用’$_id.字段别名’

如:

db.collection_2023.aggregate(
    {$set:{_id:'2023'}},
    {$unionWith:{coll:'collection_2022',pipeline:[ { $set: { _id: "2022" } } ]}},
    {$match:{sid:'S00002',p_type:{$in:[1,2,3]},data_time:{$gte:'2023-01-01',$lte:'2023-10-13'}}},
    {$project:{data_time:'$data_time',year:{$substr:['$data_time',0,4]},pnum:1,tNum:1,stayTime:1}},      
    {$group:{_id:{data_time:'$data_time',year:'$year'},sum_pnum:{$sum:'$pnum'},sum_tNum:{$sum:'$tNum'},avg_stayTime:{$avg:'$stayTime'}}},
    {$group:{_id:'$_id.year',sum_pnum:{$sum:'$sum_pnum'},sum_tNum:{$sum:'$sum_tNum'},avg_stayTime:{$avg:'$avg_stayTime'}}},      
    {$project:{data_time:1,sum_pnum:1,avg_stayTime:{$round:[{$divide:['$avg_stay_time',60]},2]},
    jdlv:{$round:[{$divide:['$sum_pnum',{$add:['$sum_pnum','$sum_tNum']}]},4]}
    }},
  {$sort:{_id:1}}
)

 

3.多次分组,即一个查询中写多个$group

不同身份(p_type)的pnum要按日求和,按周时要每日平均

db.collection_2023.aggregate(
    {$set:{_id:'2023'}},
    {$unionWith:{coll:'collection_2022',pipeline:[ { $set: { _id: "2022" } } ]}},
    {$match:{sid:'S001',p_type:{$in:[2,3,4]},data_time:{$gte:'2023-01-01',$lte:'2023-10-13'}}},
    {$project:{data_time:'$data_time',isoWeek:{$isoWeek:{date:{"$dateFromString":{"dateString":"$data_time"}},"timezone":"Asia/Shanghai"}},pnum:1,cnum:1}},
    {$group:{_id:{data_time:'$data_time',isoWeek:'$isoWeek'},sum_pnum:{$sum:'$pnum'}}},
    {$group:{_id:'$_id.isoWeek',sum_pnum:{$sum:'$sum_pnum'},avg_pnum:{$avg:'$sum_pnum'}}},
    {$project:{_id:1,sum_pnum:1,avg_pnum:{$round:['$avg_pnum',0]}}},
    {$sort:{_id:1}}
)

注,一个查询中可以出现多次match和project,match和project可出现在group之前,也可以出现在group之后

 

4.数组展开  $unwind

使用数组的值,$数组名.字段名

db.collection_2023.aggregate(
    {$set:{_id:'2023'}},
    {$unionWith:{coll:'collection_2022',pipeline:[ { $set: { _id: "2022" } } ]}},
    {$match:{pid:'S001',data_time:{$gte:'2022-12-02',$lte:'2023-10-08'}}},
    {$unwind:'$stay_time_datas'},
    {$group:{_id:'$stay_time_datas.stay_time_label',sum_cnum:{$sum:'$stay_time_datas.cnum'}}},
    {$project:{_id:1,sum_cnum:'$sum_cnum'}},
    {$sort:{_id:1}}
)

 

 5.使用对象的值

使用对象的属性,$对象名.属性名

db.collection_2023.aggregate(
    {$match:{pid:'S001',data_time:{$gte:'2023-01-01',$lte:'2023-03-13'}}},
    {$group:{_id:'$data_time',one:{$sum:'$peer.one'},two:{$sum:'$peer.two'},three:{$sum:'$peer.three'},four_or_more:{$sum:'$peer.four_or_more'}}},
    {$sort:{_id:1}}
    )

多字段排序,如{$sort:{pid:1,month:1}}

 

6.group分组之后可取$max  $min  $sum  $avg  $first第一个 $last最后一个

$max 最大值

$min 最小值

$sum 求和

$avg 求均值

$first第一个

$last最后一个

如:取最大值    
{$group:{_id:'',MaxModifytime:{$max:'$modify_time'}}}

如:$first第一个
db.collection.aggregate(  
{$match:{cid:'320100',ptime:{$gte:'2023-05-01 00:00:00',$lte:'2023-07-13 23:59:59'}}},
{$sort:{ptime:-1}},
{$group:{_id:{date1:{$substr:['$ptime',0,10]}},value:{$first:"$value"}}},
{$project:{_id:'$_id.date1',pubtime:1,value:1}},
{$sort:{_id:1}}
)

注,sort也可以出现多次,可出现在任何位置

 

7.逻辑运算符 $not  $and  $or  $nor

$not非  

$and与  

$or或  

$nor 多个条件中一个也不符合

--$not
db.user.find({age:{$ne:18}})
db.user.find({age:{$not:{$eq:18}}})

--$or
'$or':[ 
     {sre:{$in:['2']}},
     {tgt:{$in:['2']}} 
]

--'$nor
'$nor':[
     {sre:{$in:['18','19','20','21']}},
     {tgt:{$in:['18','19','20','21']}}
    ]
    
    
{$match:{dt:{$gte:'2023-08-05',$lte:'2023-09-28'},sid:'S00001',
    '$or':[ 
            {sre:{$in:['2']}},
            {tgt:{$in:['2']}} 
    ],
    '$nor':[
            {sre:{$in:['18','19','20','21']}},
            {tgt:{$in:['18','19','20','21']}}
    ],
  sex:{$in:[0,1]}, 
}}

 $and  同理

 

8.$cond聚合分析的条件操作

有两种语法

{ $cond: { if: <boolean-expression>, then: <true-case>, else: <false-case> } }

或:

{ $cond: { if: <boolean-expression>, then: <true-case>, else: <false-case> } }

如果<boolean-expression>条件为true,则执行<true-case>,否则执行<false-case>

{ "_id" : 1, "item" : "abc1", qty: 300 }
{ "_id" : 2, "item" : "abc2", qty: 200 }
{ "_id" : 3, "item" : "xyz1", qty: 250 }
db.inventory.aggregate(
   [
      {
         $project:
           {
             item: 1,
             discount:
               {
                 $cond: { if: { $gte: [ "$qty", 250 ] }, then: 30, else: 20 }
               }
           }
      }
   ]
)
>>结果:
{ "_id" : 1, "item" : "abc1", "discount" : 30 }
{ "_id" : 2, "item" : "abc2", "discount" : 20 }
{ "_id" : 3, "item" : "xyz1", "discount" : 30 }

 

9.数学运算符 加减乘除、取余 $add  $subtract  $multiply  $divide  $mod

$add  加      { $add: [ <expression1>, <expression2>, ... ] }

$subtract 减    { $subtract: [ <expression1>, <expression2> ] }

$multiply乘     { $multiply: [ <expression1>, <expression2>, ... ] }

$divide  除     { $divide: [ <expression1>, <expression2> ] }

$mod 取余     { $mod: [ <expression1>, <expression2> ] }

jdlv:{$round:[{$divide:['$pnum',{$add:['$pnum','$tNum']}]},4]}
jkl:{$round:[{$divide:['$sum_pnum',{$multiply:[56,5]}]},2]}

  

10.$strLenCP

$strLenCP  是aggregate的一个管道符返回UTF-8编码下的字符数,每个字符均计数为1

{ $strLenCP: <string expression> } 

{ $strLenCP: "Hello World!" }     12
{ $strLenCP: "" }                 0
{ $strLenCP: "寿司" }             2

 

11.$size 计算数组长度

db.collection.find( { field: { $size: 2 } } );

 

标签:unwind,pnum,mongoDB,sum,2023,time,group,data,id
From: https://www.cnblogs.com/plzh/p/17921309.html

相关文章

  • mongoDB取日周月年
    1.$dateFromString字符串转时间类型{$dateFromString:{dateString:<dateStringExpression>,  //要转化的时间字符串format:<formatExpression>,  //转换的格式,’%Y-%m-%dT%H:%M:%S.%LZ‘   timezone:<tzExpression>,  //指定时区onError:<......
  • MongoDB限定条件的查询语句
    在MongoDB里面查询语句使用如下:--限定条件进行查询db.getCollection('source_news').find("_id":{$in:[28829497251611,28829497251535,28829497251452,28829497251359,28829497251276,28829497251238,28829497251130,28829497250977,28829497250914,28829497......
  • Mongodb快速入门
    目录简介MongoDB基础知识安装&配置基本数据类型CURD操作数据库操作集合操作(表)文档操作新增文档查询文档修改文档删除文档聚合Pymongo简介MongoDB是一款强大、灵活、且易于扩展的通用型数据库易用性MongoDB是一个面向文档(document-oriented)的数据库,而不是关系型数据库。不采用......
  • MongoDB、Elasticsearch、Redis、HBase应用场景分析
    1.MongoDB一个基于分布式文件存储的数据库系统,由C++编写,旨在为Web应用提供高速、可扩展、高性能的数据存储解决方案。MongoDB采用了文档型数据库模型,即数据以文档的形式存储,而文档是由键值对组成的。MongoDB的名称来自Hadoop创始人DougCutting的宠物狗Mongo。  应用场景......
  • 爬虫-今日头条我的收藏-增量式导入到mongodb(三)
    背景:续接前文,当我们有了原始数据之后,自然会想如何利用这些数据。这些文件数据都是json格式,打开一个文本文件眼睛都要看花。所以想把这些数据导入到对应的数据库中,市面上几乎所有数据库都支持json格式存储。随着时间的推移,用户不断有新的收藏,这样就不断产生新的收藏文件。需要不......
  • MongoDB中如何优雅地删除大量数据
    删除大量数据,无论是在哪种数据库中,都是一个普遍性的需求。除了正常的业务需求,我们也需要通过这种方式来为数据库“瘦身”。为什么要“瘦身”呢?表的数据量到达一定量级后,数据量越大,表的查询性能相对也会越差。毕竟数据量越大,B+树的层级会越高,需要的IO也会越多。表的数据有......
  • R语言群组变量选择、组惩罚group lasso套索模型预测分析新生儿出生体重风险因素数据和
    原文链接:http://tecdat.cn/?p=25158原文出处:拓端数据部落公众号 本文拟合具有分组惩罚的线性回归、GLM和Cox回归模型的正则化路径。这包括组选择方法,如组lasso套索、组MCP和组SCAD,以及双级选择方法,如组指数lasso、组MCP。还提供了进行交叉验证以及拟合后可视化、总结和预测的实......
  • C9800-VLAN Group
    在AireOS的环境下,如果我们想让一个WLAN对应多个VLAN,通常来说,大家的选择可能是通过interfaceGroup的方式来实现WLAN和多个VLAN的对应。而在C9800的环境下,不再是接口和WLAN绑定的概念,在C9800上,是在PolicyProfile中配置需要的VLAN。 但是,在使用VLANGroup,需要注意相关的限制,尤其......
  • MongoDB mongoshake 迁移分片到复制集合
    Mongoshake是阿里云自研的开源工具,实现Mongodb数据库之间的数据同步,数据灾备,数据多活,分库分表,版本升级无间断。其中需要注意的一些事项1 Mongoshake尽量使用较高的版本,低版本的产品有一些Bug 2 Mongoshake在使用中需要源库的用户权限为readAnyDatabase  同时Mongoshake......
  • Linux服务器快速安装MongoDB-5.0
    最近开始体验FastGPT开源知识库问答系统,用他们试着开发调试一些小助手。这中间需要使用到MongoDB,就在自己服务器上进行了安装,特此记录下。环境说明:阿里云ECS,2核8G,X86架构,CentOS7.9操作系统。选择版本1.打开MongoDB社区版下载页面,选择我们想要安装的版本、操作系统、和包类型,......