MongoDB-文档增、删、改、查

本文详细介绍了MongoDB的基础操作,包括数据库、集合、文档的概念,以及插入、更新和删除文档的方法。重点讲解了insert、save、update、remove(包括deleteOne和deleteMany)等操作,并举例说明了各种情况下的用法,如主键冲突、多条记录处理等。此外,还涉及到了查询操作和条件操作符的使用,如$gt、$lt等,以及如何实现AND和OR条件查询。
摘要由CSDN通过智能技术生成

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)参数说明

  1. document:要写入的文档。
  2. writeConcern:写入策略。
  3. 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)语法

MongoDB2.6版本(含)之前版本,语法结构如下:

db.collection.remove(
   <query>,
   <justOne>
)

MongoDB 2.6 版本之后版本,语法格式如下:

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)

2)参数说明

1query :(可选)删除的文档的条件。

2justOne : (可选)如果设为 true 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。

3writeConcern :(可选)抛出异常的级别。

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()

  1. 语法

基本语法:

db.collection.find(query, projection)

2)参数说明

  • query :可选,使用查询操作符指定查询条件
  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
  1. 实例
  1. 查询nvhlPolicy集合的全部文档,如:查询非车订单表全部文档,执行语句:

db.nvhlPolicy.find()   

     

 

  1. 查询满足条件的全部文档,如:查询非车表10170产品全部订单,执行语句:

db.nvhlPolicy.find({'b.prodId':'10170'})

     

 

  1. 投影查询,只显示10170产品全部订单的产品ID、方案号、订单号、保单号,执行语句:

db.nvhlPolicy.find({'b.prodId':'10170'},{'b.prodId':1,'b.prodCode':1,'b.orderId':1,'b.policyId':1})

     

 

  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)和畅行版(方案号:ZHA153442个方案的全部订单数据,语句:

db.nvhlPolicy.find({$or:[{'b.prodCode':'ZHA15343'},{'b.prodCode':'ZHA15344'}]})

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值