mongoDb常用应用场景
常用命令
1 | # 密码登录验证 |
常用场景
1. 批量更新updateMany
更新对象A中包含list<对象B中设备id为a1>,且对象B中的状态为0的所有数据,把状态更新为1
数据结构
1 | { |
####updateMany
更新多条
与findAndModify
区别 findAndModify
更新单条,sort排序的首条
mongo对应的js查询脚步
1 | db.b_customer_info_device.updateMany({"devices_statuses.status":"0","devices_statuses.device_id":"a1"},{$pull:{"devices_statuses":{term_id:"D00010"}}}); |
springboot对应写法
1 | Query query = new Query(Criteria.where("devices_statuses.device_id").is(termId).and("devices_statuses.status").in("0"); |
2. 正则匹配$regex
1 | ---data |
3. 聚合查询aggregate
数据结构
1 | { |
group
按_id
里面的字段进行分组统计,这里按code
字段进行分组
_id:null
统计所有
_id:"$code"
按code字段进行统计
1 | db.getCollection("m_user").aggregate([ |
执行结果
1 | { |
group双层嵌套($push)-Pivot Data
先group统计最内层,然后把group聚合的数组对象放到子对象那(利用 subName: { $push: "$$ROOT" }
)
$push: "$$ROOT"
是把聚合的对象放到一个字段subName里面
然后对统计好的再进行统计,如果要统计子对象数组里面的某个字段的数量,用{ $sum: "$$ROOT.total" }
1 | -- 先统计event_id |
project
控制输出显示的结果
1为显示该字段
1 | "$project": { |
cond
类似case when
cond里面的if只支持一个条件,但是cond可以嵌套
Java: ConditionalOperators
1 | --如果$err_status=5 输出 1否则输出 0 |
match
条件过滤
1 |
unwind
嵌入实体平铺,1个对象里面包含数组,平铺成一个对象对一个数组的内容,最终等于数组的条数
1 | "$unwind": "$term_info" |
lookup
Java: LookupOperation
表关联左连接
1 | -- 表2为主集合 |
elemMatch
内嵌数组,查询,其中数组里面的一个对象完全满足才会查出来
1 | "$elemMatch": { |
对应java
1 | Query query = new Query(Criteria.where("devices_statuses").elemMatch( |
facet
多条语句组合一个结果,a,b,c各为独立的查询语句
1 | db.getCollection("b_company").aggregate([ |
对应java
1 | Aggregation aggregation = Aggregation.newAggregation( |
$substr
日期转换为天
1 | -- yyyy-mm-dd HH:mm:ss 转化成 yyyy-mm-dd |
最终示例
1 | db.getCollection("b_customer_info_device").aggregate([ |
对应mongotemplate
1 | ConditionalOperators.Cond condOperatorsFeature=ConditionalOperators.when( |
表关联子类统计
按类别统计每个事件的数量,输出结果如下
1 | |-类型1 |
1 | String startTime = startDay + " 00:00:00"; |
1 | db.getCollection("b_event_info").aggregate([ |