前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >零基础学习MongoDB(五)—— 文档CRUD操作

零基础学习MongoDB(五)—— 文档CRUD操作

作者头像
小丞同学
发布2021-08-16 16:14:18
1.3K0
发布2021-08-16 16:14:18
举报
文章被收录于专栏:小丞前端库
mongo5
mongo5

一、插入数据

1.1 插入单条文档

1.1.1 insert 函数

语法格式db.collectionName.insert(文档)

  • db是当前操作的数据库
  • collectionName是操作的集合,没有会自动创建
  • 插入的文档如果没有_id属性,会自动创建

例如在user集合下插入单个文档

代码语言:javascript
复制
db.user.insert({name:"ljc",love:["soccer","music"]})

在可视化工具中实操的结果,在命令行中结果一致!

image-20210711164118797
image-20210711164118797
1.1.2 insertOne 函数

在 MongoDB3.2 之后的版本中,提供了 insertOne()函数用于插入文档,同时废弃了save函数,因此就不学习它了,它的使用方法和insert相同

语法格式:db.COLLECTION_NAME.insertOne(document)

例如在user集合下插入单个文档

代码语言:javascript
复制
db.user.insertOne({name:"ddd",love:["play game","running"]})

在可视化工具中实操的结果,在命令行中结果一致!

image-20210711165046920
image-20210711165046920

1.2 插入多条文档

向集合中批量插入多个文档时,需要使用数组来存放文档

1.2.1 insert 函数

语法格式:db.COLLECTION_NAME.insert([{},{},{}…])

例如采用insertuser中批量插入人员信息

代码语言:javascript
复制
db.user.insert([{name:"张三",age:"18"},{name:"李四",age:"19"}])
image-20210711170351546
image-20210711170351546
1.2.2 insertMany 函数

语法格式:db.COLLECTION_NAME.insertMany([{},{},{}…])

例如采用insertManyuser中批量插入人员信息

代码语言:javascript
复制
db.user.insertMany([{name:"王五",age:"28"},{name:"唐六",age:"29"}])
image-20210711170710492
image-20210711170710492

1.3 tips

代码语言:javascript
复制
db.COLLECTION_NAME.insertOne(document)
db.COLLECTION_NAME.insertMany(document)
db.COLLECTION_NAME.replaceOne(document)

参数说明

  1. document:要写入的文档
  2. writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求
  3. ordered:指定是否按顺序写入,默认 true,按顺序写入

二、更新文档

MongoDB通过update函数或者save函数来更新集合中的文档。

2.1 update 函数

update() 函数用于更新已存在的文档。

语法格式为:

代码语言:javascript
复制
db.COLLECTION_NAME.update(query,update,options)
  1. query : update的查询条件,根据这个来选择需要更新的数据
  2. updateupdate的对象和一些更新的操作符
  3. upsert:可选参数,意思是如果不存在需要更新的数据,是否要作为新数据插入集合中,参数值为true或者false,默认值是false,不插入
  4. multi:可选参数,是否批量更新,意思是当查询到多个符合查询条件的数据时,是否要全部更新,还是只更新第一条,默认是false
  5. writeConcern:可选参数,抛出异常的级别

实操

首先我们在user集合下插入一些数据

代码语言:javascript
复制
db.user.insertMany([{title:"html",page:300},{title:"css",page:300},{title:"js",page:200},{title:"ts",page:250},{title:"webpack",page:220}])

插入成功

image-20210712010401820
image-20210712010401820

接下来我们来对集合中的数据进行更新

第一个需求:将htmlpage改成500

代码语言:javascript
复制
db.user.update({title:"html"},{title:"html",page:500})
image-20210712011107780
image-20210712011107780

特别注意:更新文档是更新整个文档的操作,即使只需要修改一个值,其他属性一样需要写下来,不然其他属性将被删除

第二个需求:将所有page为200的改为400

代码语言:javascript
复制
db.user.update({page:200},{$set:{page:400}},{multi:true})

操作结果

image-20210712011839152
image-20210712011839152

在上面采用了$set操作符,用来只更新数据中的某个属性

2.2 updateOne 和updateMany

db.collection.updateOne() 向指定集合更新单个文档

db.collection.updateMany() 向指定集合更新多个文档

2.3 更新操作符

2.3.1 $set 操作符

用来指定一个键并更新键值,若键不存在则创建。也就是我们可以通过这个操作符,指定我们需要修改的属性,而不用更新整个文档

语法格式db.COLLECTION_NAME.update({查询条件},{更新操作符:{更新内容}})

html改成html5

代码语言:javascript
复制
db.user.update({title:"html"},{$set:{title:"html5"}});

这样我们就将查找到的文档中的某个数据修改,而不删除其他数据

如果数据未被找到,则新建新增数据

2.3.2 $inc 操作符

对文档中满足要求的数字型的值进行增减操作,正则增,负则减

代码语言:javascript
复制
db.user.updateOne({title:"js"},{$inc:{page:-20}})

titlejs的数据的page属性进行减20的操作

image-20210712015531485
image-20210712015531485
2.3.3 $unset 操作符

用来删除键,让键的值为空。在编写命令时$unset里更改数据取值任意,无论给定什么值都表示删除。

删除htmlpage

代码语言:javascript
复制
db.user.update({title:"html"},{$unset:{page:"aaaa"}});
image-20210712020103682
image-20210712020103682
2.3.4 $push 操作符

这里插入一个点:如果需要更改全部数据,我们的query属性填{}即可,也就是查找全部

向文档的某个数组类型的键添加一个数组元素,不过滤重复的数据。键不存在,则创建数组类型的键

给所有的文档添加一个auth字段,值为ljc

代码语言:javascript
复制
db.user.update({},{$push:{auth:"ljc"}},{multi:true});

从结果来看是添加成功,需要注意的是,数组,数组,数组!

image-20210712021907313
image-20210712021907313
2.3.5 $pop 操作符

删除数据中数组元素,取值只能是1或-1,1表示尾部删除,-1表示头部删除

首先我们先push一下,让数组丰富一点,给html添加多一个auth

代码语言:javascript
复制
db.user.update({title:"html"},{$push:{auth:"htmlauth"}});
image-20210712022355332
image-20210712022355332

接下来演示pop操作,删除htmlauth数组的第一个值

代码语言:javascript
复制
db.user.update({title:"html"},{$pop:{auth:-1}})
image-20210712022814969
image-20210712022814969
2.3.6 pull 操作符

从数组中删除满足条件的元素,只要满足条件都删除

删除auth数组中元素内容为ljc

代码语言:javascript
复制
db.user.update({title:"js"},{$pull:{auth:"ljc"}})
image-20210712023616033
image-20210712023616033
2.3.7 pullAll 操作符

可以同时删除数组中的多个值

tsauthljc以及ccc删除掉

代码语言:javascript
复制
db.user.update({title:"ts"},{$pullAll:{auth:["ljc","ccc"]});
2.3.8 rename 操作符

对键进行重新命名。任何类型的键都能重命名

将所有title的属性名改成name

代码语言:javascript
复制
db.user.update({},{$rename:{title:"name"}},{multi:true})

成功将改成了name

image-20210712024301297
image-20210712024301297

三、删除文档

3.1 remove 函数

语法格式:

代码语言:javascript
复制
db.user.remove(<query>,{justOne:<boolean>})

参数说明:

  • query:可选删除的文档条件
  • justOne:删除多个或者一个文档。true只删除一个,false删除所有匹配的数据

删除name值为html的文档

代码语言:javascript
复制
db.user.remove({name:"html"},{justOne:true})

成功删除

image-20210712025651467
image-20210712025651467

删除所有数据

代码语言:javascript
复制
db.user.remove({})

注意:remove丰富不会真正的释放空间,需要执行db.repairDatabase()来回收磁盘空间

3.2 deleteOne 函数

该方法只删除满足条件的第一条文档,相对于remove简洁了很多

删除js

代码语言:javascript
复制
db.user.deleteOne({name:"js"})

3.3 deleteMany 函数

删除满足条件的所有文档

删除所有page200的文档

代码语言:javascript
复制
db.user.deleteMany({page:200})

四、查询文档

查询文档采用find函数

语法格式

代码语言:javascript
复制
db.collection.find(query, projection)
  • query :可选,指定查询的条件
  • projection :可选,使用投影操作符指定返回的键

**注意:**可以通过db.collection.find().pretty()方法以易读的方式来读取数据

同样的可以使用findOne方法,返回一个文档

4.1 查询所有

查询所有文档

代码语言:javascript
复制
db.user.find({})

根据名字去重

代码语言:javascript
复制
db.user.distinct("name")

注意:MongoDB中使用方法一般都要$号开头

4.2 条件操作符

采用条件操作符用于比较两个表达式,再从集合中获取数据

语法格式:find({键:{操作符:条件}})

findOne也可以噢~

4.2.1 $eq

等于操作符

查询所有page为300的文档对象

代码语言:javascript
复制
db.user.find({page:{$eq:300}})
image-20210712125557941
image-20210712125557941
4.2.2 $lt

小于操作符

查询page小于300的文档对象

代码语言:javascript
复制
db.user.find({page:{$lt:300}})
image-20210712125645192
image-20210712125645192
4.2.3 $lte

小于或等于操作符

查询page小于等于300的文档对象

代码语言:javascript
复制
db.user.find({page:{$lte:300}})
image-20210712125846314
image-20210712125846314
4.2.4 $gt

大于操作符

查询page大于250的文档对象

代码语言:javascript
复制
db.user.find({page:{$gt:250}})
image-20210712125956480
image-20210712125956480
4.2.5 $gte

大于等于操作符

查询page大于等于300的文档对象

代码语言:javascript
复制
db.user.find({page:{$gte:300}})
image-20210712130154607
image-20210712130154607
4.2.6 $ne

不等于操作符

查询page不等于300的文档对象

代码语言:javascript
复制
db.user.find({page:{$ne:300}})
image-20210712130326669
image-20210712130326669
4.2.7 $in

多条件查询,只要满足in中其中一个条件,就能被查询出来

查询page220300的文档对象

代码语言:javascript
复制
db.user.find({page:{$in:[300,220]}})
image-20210712130832662
image-20210712130832662

注意:$in后面的值是一个数组类型!!

4.2.8 $nin

in相反,除了in中的都查询出来

查询page不为220300的文档对象

代码语言:javascript
复制
db.user.find({page:{$nin:[300,220]}})
image-20210712131038761
image-20210712131038761
4.2.9 $and

查找同时满足多个条件的文档对象

语法格式:

代码语言:javascript
复制
db.col.find({$and:[{条件一},{,条件二},…]})

查询page300并且name值为node的文档

代码语言:javascript
复制
db.user.find({$and:[{name:"node"},{page:300}]})
image-20210712132156567
image-20210712132156567

当同时指定多个查询条件时,默认是并列关系,因此我们可以直接写

代码语言:javascript
复制
db.user.find({name:"node"},{page:300})
4.2.10 $or

查询至少满足多个条件中其中一个的文档对象

查询page300或者name值为node的文档

代码语言:javascript
复制
db.user.find({$or:[{name:"node"},{page:300}]})
image-20210712132617726
image-20210712132617726
4.2.11 $type 操作符

根据值类型来查询

查询page为的值类型为number的值

代码语言:javascript
复制
db.user.find({page:{$type:"number"}})
image-20210712140953241
image-20210712140953241

数据类型如下,来自菜鸟教程

image-20210712141211056
image-20210712141211056

可以使用类型对应的数字来指定

代码语言:javascript
复制
db.col.find({"title" : {$type : 2}})
等价于
db.col.find({"title" : {$type : 'string'}})

4.3 正则查询

利用正则表达式来查询特定格式的文档

查询names结尾,不区分大小写的文档

代码语言:javascript
复制
db.user.find({name:/s$/i})
image-20210712141924128
image-20210712141924128

4.4 投影查询

只选择文档中的部分数据,而不是整个文档全部数据

find()方法中默认会显示一个文档中的全部字段,要限制这点只需要设置字段列表值01

只显示name值,同时不显示_id

代码语言:javascript
复制
db.user.find({},{_id:0,name:1})
image-20210712144437327
image-20210712144437327

显示namepage

代码语言:javascript
复制
db.user.find({},{page:1,name:1})
image-20210712144613987
image-20210712144613987

注意:_id字段是默认存在的!!

不显示namepage

代码语言:javascript
复制
db.user.find({},{page:0,name:0})
image-20210712144750888
image-20210712144750888

特别注意:只有在设置_id:0,的情况下才允许属性值不同,也就是对于除_id以外的数据,不允许同时一个设置1,一个设置0

例如:

代码语言:javascript
复制
db.user.find({},{_id:0,page:1,name:0})

报错

image-20210712145242255
image-20210712145242255

4.5 数组查询

在我们的数据集中,常常会有数组的存在,因此,查询数组也是很重要的

  1. 查询auth数组中有ljc的文档
代码语言:javascript
复制
db.user.find({auth:"ljc"})
image-20210712151255562
image-20210712151255562

2. 查询auth数组中既有ljc又有cssauth的文档

代码语言:javascript
复制
db.user.find({auth:{$all:["ljc","cssauth"]}})
image-20210712151501836
image-20210712151501836

3. 查询auth数组中第二个元素为ljc的文档

通过auth.1来指定数组的第二个元素

代码语言:javascript
复制
db.user.find({"auth.1":"ljc"})
image-20210712151719623
image-20210712151719623

4. 查询auth数组中第一个到第二个元素(其他字段保留)

代码语言:javascript
复制
db.user.find({},{auth:{$slice:[0,2]}})
image-20210712155412805
image-20210712155412805

5. 查询auth数组中最后一个元素

代码语言:javascript
复制
db.user.find({},{auth:{$slice:-1}})
image-20210712160203791
image-20210712160203791

4.6 排序

采用sort方法,根据数据进行排序,使用1-1来指定排序方式为升序还是降序

根据page有小到大进行排序

代码语言:javascript
复制
db.user.find().sort({page:1})
image-20210712161655804
image-20210712161655804

4.7 分页

使用limit()方法来读取指定数量的数据外,再使用skip()方法来跳过指定数量的数据

语法格式

代码语言:javascript
复制
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

实例

代码语言:javascript
复制
db.user.find.limit(2).skip(0) #前两个
db.user.find.limit(2).skip(2) #3,4

4.8 统计

count用来计算符合条件的值有多少个

统计page中小于270的有多少个

代码语言:javascript
复制
db.user.count({"page":{$lt:270}})
image-20210712163343467
image-20210712163343467
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/07/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、插入数据
    • 1.1 插入单条文档
      • 1.1.1 insert 函数
      • 1.1.2 insertOne 函数
    • 1.2 插入多条文档
      • 1.2.1 insert 函数
      • 1.2.2 insertMany 函数
    • 1.3 tips
    • 二、更新文档
      • 2.1 update 函数
        • 2.2 updateOne 和updateMany
          • 2.3 更新操作符
            • 2.3.1 $set 操作符
            • 2.3.2 $inc 操作符
            • 2.3.3 $unset 操作符
            • 2.3.4 $push 操作符
            • 2.3.5 $pop 操作符
            • 2.3.6 pull 操作符
            • 2.3.7 pullAll 操作符
            • 2.3.8 rename 操作符
        • 三、删除文档
          • 3.1 remove 函数
            • 3.2 deleteOne 函数
              • 3.3 deleteMany 函数
              • 四、查询文档
                • 4.1 查询所有
                  • 4.2 条件操作符
                    • 4.2.1 $eq
                    • 4.2.2 $lt
                    • 4.2.3 $lte
                    • 4.2.4 $gt
                    • 4.2.5 $gte
                    • 4.2.6 $ne
                    • 4.2.7 $in
                    • 4.2.8 $nin
                    • 4.2.9 $and
                    • 4.2.10 $or
                    • 4.2.11 $type 操作符
                  • 4.3 正则查询
                    • 4.4 投影查询
                      • 4.5 数组查询
                        • 4.6 排序
                          • 4.7 分页
                            • 4.8 统计
                            相关产品与服务
                            云数据库 MongoDB
                            腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档