mongodb增删改查 及批量操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb增删改查 及批量操作相关的知识,希望对你有一定的参考价值。
1.查select
(1).通过$all 进行匹配查询
db.food.find(fruit:$all:[apple,banana])
以下方式将查不到数据(不使用$all)
db.food.find(fruit:[apple,banana])
db.food.find(fruit:[banana,apple,peach])
查询数组中特定位置的元素,需要使用key.index查找
db.food.find(fruit.2:peach)
(2).通过$size 查询数组的长度
db.food.find(fruit:$size:2)
(3).数组和范围查询的相互作用
db.test6.find(x:$gt:10,$lt:20)
查询出来,查询数组中带有小于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)
这3个方法可以组合使用,每页返回50条记录,跳过前50条记录进行倒排序
db.stu.find().limit(50).skip(50).sort(sn:-1)
用skip略过少量的文档还是不错的,但是要是数量非常多的话,skip就会变的很慢,因为要先找到需要被略过的数据,然后再抛弃这些数据
(5).随即获取文档中的数据
db.stu.find(sn:$lt:Math.random()*10)
(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);
在举一个栗子(对相应字段的更新,在查询条件上也要带上,否则报错)
db.attendTpl.update("category": "hljld",components.font:3,$set:components.$.font:3.18,multi:true);
2.聚合查询
(1).count
(2).distinct
distinct命令必须指定集合名称,如test,以及需要区分的字段,如:age
db.runCommand("distinct":"test", "key":"age")
(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;
)
统计每个分组内文档的数量
db.test5.group(
key: day: true,
initial: count: 0,
reduce: function(obj,prev) prev.count++;,
)
最后一个是通过完成器修改reduce结果的例子
db.test5.group(
key: day: true,
initial: count: 0,
reduce: function(obj,prev) prev.count++;,
finalize: function(out) out.scaledCount = out.count * 10 --在结果文档中新增一个键。
)
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. |
(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>
)
表中的数据如下:
此时要在所有的行上增加name字段,操作如下:
db.test1.update(,$set:name:zhangsan,true,true);
方法2:
db.test1.updateMany(,$set:name:zhangsan);
6.修改嵌套数组中的值
脚本如下:
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增删改查 及批量操作的主要内容,如果未能解决你的问题,请参考以下文章