MongoDB常用操作
一、基本概念
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
二、MongoDB插入文档
1. insert()
1)语法
db.COLLECTION_NAME.insert(document)
2)说明
insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。
3)实例
(1)插入记录
db.mall_branch.insert({"_id": '4_110101195511043118',"cn": "天门支公司","c": "429830","ci": "4","n": "插入文档测试一"})
(2)检验是否插入成功
db.mall_branch.find({"_id": '4_110101195511043118',"cn": "天门支公司","c": "429830","ci": "4","n": "插入文档测试一"})
(3)再执行一遍插入,_id重复,报错
{
"message" : "WriteError({'code':11000,'index':0,'errmsg':'E11000 duplicate key error collection: seq.mall_branch index: _id_ dup key: { : \\'4_110101195511043118\\' }','op':{'_id':'4_110101195511043118','cn':'天门支公司','c':'429830','ci':'4','n':'插入文档测试一'}})",
"stack" : "script:1:16"
}
2. save()
1)语法
db.COLLECTION_NAME.save(document)
2)说明
save():如果 _id 主键存在则更新数据,如果不存在就插入数据。
3)实例
(1)主键不重复--新增
db.mall_branch.save({"_id":'4_110101198011043836',"cn": "天门支公司","c": "429830","ci": "4","n": "插入文档测试四"})
(2)主键重复—修改
db.mall_branch.save({"_id":'4_110101198011043836',"cn": "天门支公司","c": "429830","ci": "4","n": "插入文档测试四一"})
3. insertOne()
1)语法
db.collection.insertOne(
<document>,
{
writeConcern: <document> //可选
}
)
2)说明
用于向集合插入一个新文档。
3)实例
db.mall_branch. insertOne({"_id":'4_110101198011043836',"cn": "天门支公司","c": "429830","ci": "4","n": "插入文档测试四"})
插入文档主键重复报错:
4. insertMany()
1)语法
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document> //可选参数
ordered: <boolean> //可选参数
}
)
2)说明
用于向集合插入一个多个文档。文档用{}括起,不同文档以,隔开,全部文档用[]括起。
3)参数说明
- document:要写入的文档。
- writeConcern:写入策略。
- ordered:指定是否按顺序写入,默认 true,按顺序写入。
为true:执行文档的有序插入,并且如果其中一个文档发生错误,MongoDB 将返回而不处理数组中的其余文档;
为false:则执行无序插入,若其中一个文档发生错误,则忽略错误,继续处理数组中的其余文档。
4)实例
以下文档可以存储在 MongoDB 的 runoob 数据库 的 col 集合中:
插入2个文档
db.mall_branch.insertMany([
{"_id":'4_110101198011049170',"cn": "天门支公司","c": "429830","ci": "4","n": "插入文档测试九"},
{"_id":'4_110101198011048194',"cn": "天门支公司","c": "429830","ci": "4","n": "插入文档测试十"}])
5.将文档赋值给变量
1)插入1条文档
可以把文档赋值给变量,插入变量,以insertOne()为例:
var document=({"_id":'4_110101198011044951',"cn": "天门支公司","c": "429830","ci": "4","n": "插入文档测试一一"})
db.mall_branch.insertOne(document)
2)插入多条文档
将多条文档赋值给数组,插入数组。
var arr=[{"_id":'4_110101198011048856',"cn": "天门支公司","c": "429830","ci": "4","n": "插入文档测试一二"},{"_id":'4_110101198011040192',"cn": "天门支公司","c": "429830","ci": "4","n": "插入文档测试一三"}]
db.mall_branch.insertMany(arr)
三、MongoDB 更新文档
MongoDB 使用 update() 和 save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。
1.update()方法
1)语法
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
2)参数说明
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
3)实例
(1)更新1条
我们用之前插入的第1条文档做更新:
接着我们通过 update() 方法来更新姓名字段(n):
db.mall_branch.update({"_id":"4_110101195511043118"},{$set:{"n":"更新文档测试一"}})> db.col.find()
查询检验一下,可以看到n由“插入文档测试一”变更为:“更新文档测试一”。
db.mall_branch.find({"_id": '4_110101195511043118'})
以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。
(2)更新多条
db.mall_branch.find({"n": /^插入文档测试一/}),以姓名以“插入文档测试”开头的全部文档,一共有以下3条:
用以下语句,把姓名以“插入文档测试一”开头的所有文档的n都改为:更新文档测试团队:
db.mall_branch.update({"n": /^插入文档测试一/},{$set:{"n":"更新文档测试团队"}},{multi:true})
可以看到,查询的话,已经都修改成功。
2.save() 方法
save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入
3. 更多实例
只更新第一条记录:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一条:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加进去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一条记录:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
四、MongoDB 删除文档
1.remove()
注:在执行 remove() 函数前先执行 find() 命令来判断执行的条件是否正确,这是一个比较好的习惯。
1)语法
MongoDB是2.6版本(含)之前版本,语法结构如下:
db.collection.remove(
<query>,
<justOne>
)
MongoDB 是 2.6 版本之后版本,语法格式如下:
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
2)参数说明
(1)query :(可选)删除的文档的条件。
(2)justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
(3)writeConcern :(可选)抛出异常的级别。
3)实例
1.删除满足查询条件的全部文档。
首先,用 find() 函数查询数据,找到:名称为“更新文档测试团队”的全部文档:db.mall_branch.find({"n":" 更新文档测试团队"})。
接下来我们移除n为" 更新文档测试团队"的全部文档:
db.mall_branch.remove({"n":" 更新文档测试团队"})
> db.mall_branch.find({"n":"更新文档测试团队"} # 没有数据
2. 只删除第一条找到的记录,可以设置justOne 为 1。
语法:
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
实例:
删除名称以“插入文档测试”开头的第一条文档,先查询一下:
db.mall_branch.find({"n": /^插入文档测试/})。
删除第1条:
db.mall_branch.remove({"n":/^插入文档测试/},1)
查询验证:
3. 删除集合中所有数据
>db.COLLECTION_NAME.remove({})
2.deleteOne()
删除 status 等于 D 的一个文档:
db.inventory.deleteOne( { status: "D" } )
实例:
删除第一条以“插入文档测试”开头的第一条文档,先查询看一下:
执行删除语句:db.mall_branch.deleteOne({"n": /^插入文档测试/})。
查询验证:
3.deleteMany()
1) 删除满足查询条件的全部文档:
语法:
db.inventory.deleteMany({ status : "A" })
实例:
删除名称以“插入文档测试”开头的全部文档,语句:
db.mall_branch.deleteMany({"n": /^插入文档测试/})。
查询验证:
db.mall_branch.find({"n": /^插入文档测试/})
2)删除集合下全部文档:
语法:
db.inventory.deleteMany({})
五、MongoDB 查询文档
MongoDB 查询文档使用 find() 方法。find() 方法以非结构化的方式来显示所有文档。
1.Find()
- 语法
基本语法:
db.collection.find(query, projection)
2)参数说明
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
- 实例
- 查询nvhlPolicy集合的全部文档,如:查询非车订单表全部文档,执行语句:
db.nvhlPolicy.find()。
- 查询满足条件的全部文档,如:查询非车表10170产品全部订单,执行语句:
db.nvhlPolicy.find({'b.prodId':'10170'})。
- 投影查询,只显示10170产品全部订单的产品ID、方案号、订单号、保单号,执行语句:
db.nvhlPolicy.find({'b.prodId':'10170'},{'b.prodId':1,'b.prodCode':1,'b.orderId':1,'b.policyId':1})。
- 除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档,如:值查询3.中的第1条文档,执行语句:
db.nvhlPolicy.findOne({'b.prodId':'10170'},{'b.prdId':1,'b.prodCode':1,'b.orderId':1,'b.policyId':1})
注:只能以json格式显示。
六、MongoDB 条件操作符
1.条件操作符
条件操作符用于比较两个表达式并从mongoDB集合中获取数据。
在本章节中,我们将讨论如何在MongoDB中使用条件操作符。
MongoDB中条件操作符有:
- (>) 大于:$gt
- (<) 小于:$lt
- (>=) 大于等于:$gte
- (<= ) 小于等于:$lte
- (!= )不等于:$ne
MongoDB 与 RDBMS Where 语句比较:
操作 | 格式 | 范例 | RDBMS中的类似语句 |
等于 | {<key>:<value>} | db.col.find({"by":"菜鸟教程"}) | where by = '菜鸟教程' |
小于 | {<key>:{$lt:<value>}} | db.col.find({"likes":{$lt:50}}) | where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} | db.col.find({"likes":{$lte:50}}) | where likes <= 50 |
大于 | {<key>:{$gt:<value>}} | db.col.find({"likes":{$gt:50}}) | where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} | db.col.find({"likes":{$gte:50}}) | where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} | db.col.find({"likes":{$ne:50}}) | where likes != 50 |
实例:
这里以大于或等于“$gte”为例,查询10170产品,保费>=500的全部数据:
db.nvhlPolicy.find({'b.prodId':'10170','b.sumPremium':{$gte:500}}),执行结果:
2. MongoDB AND 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
语法格式如下:
>db.col.find({key1:value1, key2:value2})
实例:
查询非车订单表中,10170产品,乐行版(方案号:ZHA15345)方案全部文档,语句:
db.nvhlPolicy.find({'b.prodId':'10170','b.prodCode':'ZHA15345'})。
3.MongoDB OR 条件
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
)
实例:
查询非车订单表中,10170产品安行版(方案号:ZHA15343)和畅行版(方案号:ZHA15344)2个方案的全部订单数据,语句:
db.nvhlPolicy.find({$or:[{'b.prodCode':'ZHA15343'},{'b.prodCode':'ZHA15344'}]})。