mongodb增删改查 及批量操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb增删改查 及批量操作相关的知识,希望对你有一定的参考价值。

1.查select

(1).通过$all 进行匹配查询
db.food.find(fruit:$all:[apple,banana])

mongodb增删改查

以下方式将查不到数据(不使用$all)

db.food.find(fruit:[apple,banana])
db.food.find(fruit:[banana,apple,peach])

查询数组中特定位置的元素,需要使用key.index查找

db.food.find(fruit.2:peach)

mongodb增删改查

(2).通过$size 查询数组的长度
db.food.find(fruit:$size:2)

mongodb增删改查

(3).数组和范围查询的相互作用
db.test6.find(x:$gt:10,$lt:20)

mongodb增删改查

查询出来,查询数组中带有小于10的数据,不符合要求

db.test6.find(x:$gt:10,$lt:20.min(x:10).max(x:20))   #目前是错误,首先要在x字段上创建索引
(4).limit、skip和sort

只返回3条记录

db.stu.find().limit(3)

跳过前3个记录

db.stu.find().skip(3)

按照sn进行倒排序

db.stu.find().sort(sn:-1)

mongodb增删改查

这3个方法可以组合使用,每页返回50条记录,跳过前50条记录进行倒排序

db.stu.find().limit(50).skip(50).sort(sn:-1)

mongodb增删改查

用skip略过少量的文档还是不错的,但是要是数量非常多的话,skip就会变的很慢,因为要先找到需要被略过的数据,然后再抛弃这些数据

(5).随即获取文档中的数据
db.stu.find(sn:$lt:Math.random()*10)

mongodb增删改查

(6).正则表达式匹配条件查询

匹配单个条件

db.mongodb_PatInhosOrder.find(orderText:/红细胞/)

匹配多个条件

db.mongodb_PatInhosOrder.find(orderText:/(白细胞|红细胞)/)

也可以采用or的方式进行匹配

db.mongodb_PatInhosOrder.find($or:[orderText:/白细胞/,orderText:/红细胞/])
(7).修改多行数据(多层嵌套,需要连续执行多次才可以全部更新完,此处有疑问,按理执行一次即可)

注:此功能已经在3.4中不支持了

db.docTpl.update(components.components.canvas_content.comp:./package/default/Label/index,$set:components.components.canvas_content.$.comp:./package/default/Text/index,multi:true);

mongodb增删改查

在举一个栗子(对相应字段的更新,在查询条件上也要带上,否则报错)

 db.attendTpl.update("category": "hljld",components.font:3,$set:components.$.font:3.18,multi:true); 

2.聚合查询

(1).count

mongodb增删改查

(2).distinct

distinct命令必须指定集合名称,如test,以及需要区分的字段,如:age

mongodb增删改查

db.runCommand("distinct":"test", "key":"age")

mongodb增删改查

(3).group

group做的聚合有些复杂。先选定分组所依据的键,此后MongoDB就会将集合依据选定键值的不同分成若干组。然后可以通过聚合每一组内的文档,产生一个结果文档

准备测试数据:

db.test5.remove()
db.test5.insert("day" : "2012-08-20", "time" : "2012-08-20 03:20:40", "price" : 4.23)
db.test5.insert("day" : "2012-08-21", "time" : "2012-08-21 11:28:00", "price" : 4.27)
db.test5.insert("day" : "2012-08-20", "time" : "2012-08-20 05:00:00", "price" : 4.10)
db.test5.insert("day" : "2012-08-22", "time" : "2012-08-22 05:26:00", "price" : 4.30)
db.test5.insert("day" : "2012-08-21", "time" : "2012-08-21 08:34:00", "price" : 4.01)

这里将用day作为group的分组键,然后取出time键值为最新时间戳的文档,同时也取出该文档的price键值。

db.test5.group( 
"key" : "day":true, --如果是多个字段,可以为"f1":true,"f2":true
"initial" : "time" : "0", --initial表示reduce函数参数prev的初始值。每个组都有一份该初始值。"reduce" : function(doc,prev) --reduce函数接受两个参数,doc表示正在迭代的当前文档,prev表示累加器文档。
if (doc.time > prev.time)
prev.day = doc.day
prev.price = doc.price;
prev.time = doc.time;

)

mongodb增删改查

统计每个分组内文档的数量

   db.test5.group( 
key: day: true,
initial: count: 0,
reduce: function(obj,prev) prev.count++;,
)

mongodb增删改查

最后一个是通过完成器修改reduce结果的例子  

   db.test5.group( 
key: day: true,
initial: count: 0,
reduce: function(obj,prev) prev.count++;,
finalize: function(out) out.scaledCount = out.count * 10 --在结果文档中新增一个键。
)

mongodb增删改查

3.批量操作

db.collection.bulkWrite()方法能够执行批量插入,更新和删除操作   
db.collection.bulkWrite(
[ <operation 1>, <operation 2>, ... ],

writeConcern : <document>,
ordered : <boolean>

)

Parameter

Type

Description

operations

array

An array of bulkWrite()

Valid operations are:

See ​​Write Operations​​ for usage of each operation.

writeConcern

document

Optional. A document expressing the ​​write concern​​. Omit to use the default write concern.

ordered

boolean

Optional. A boolean specifying whether the ​​mongod​​ instance should perform an ordered or unordered operation execution. Defaults to true.

See ​​Execution of Operations​

(1).insertOne

功能等同于db.collection.insertOne().  

db.collection.bulkWrite( [
insertOne : "document" : <document>
] )
(2).updateOne

功能等同于db.collection.updateOne()

db.collection.bulkWrite( [
updateOne :

"filter" : <document>,
"update" : <document>,
"upsert" : <boolean>


] )
(3).updateMany

功能等同于db.collection.updateMany() 

db.collection.bulkWrite( [
updateMany :

"filter" : <document>,
"update" : <document>,
"upsert" : <boolean>


] )

4.将其中的两个字段拼接后赋值给另外一个字段

关系型数据库的写法

update aa set remark = age+name;

mongodb中的写法

db.aa.find().forEach( function(u)

printjson(u.age+u.name);
db.aa.update(_id:u._id,$set:remark:u.age+u.name,multi:true) ;
);

5.mongodb中批量添加一列

方法1:
b.collection.update(
<query>,
<update>,

upsert: <boolean>, #设置为true时,当匹配的条件不存在时插入一行,默认为false
multi: <boolean>, #设置为true时,可以修改多行,默认为false只修改一行
writeConcern: <document>

)

表中的数据如下:

mongodb增删改查

此时要在所有的行上增加name字段,操作如下:

db.test1.update(,$set:name:zhangsan,true,true);

mongodb增删改查

方法2:
db.test1.updateMany(,$set:name:zhangsan);

mongodb增删改查

6.修改嵌套数组中的值

mongodb增删改查

脚本如下:

db.orderProcess.update(orderbar:"8008401450",$set:"tasks.0.executeTime":ISODate("2020-04-17T19:26:19.238+08:00"))

官网地址:​https://docs.mongodb.com/manual/reference/method/cursor.forEach/​

以上是关于mongodb增删改查 及批量操作的主要内容,如果未能解决你的问题,请参考以下文章

Spring整合MongoDB增删改查及批量新增修改

Spring整合MongoDB增删改查及批量新增修改

Spring整合MongoDB增删改查及批量新增修改

mongodb 集合操作 (增删改查)

MongoDB对数组元素及内嵌文档进行增删改查操作

mongodb对数组元素及内嵌文档进行增删改查操作(转)