MongoDB-CRUD操作

在这里插入图片描述

生活中除了学习和编程,还有很多美好的事物,我们要把时间浪费在自己喜欢的事物上。

文档地址:https://docs.mongoing.com/

1、插入文档(insert)


MongoDB 使用 insert()save() 方法向集合中插入一条或多条文档,语法格式如下:

db.collection.insert(
   <document or array of documents>,
   {
     writeConcern: <document>,  // writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。

     ordered: <boolean> // ordered:指定是否按顺序写入,默认 true,按顺序写入。
   }
)
db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)
  • insert(): 若插入的数据主键已经存在,则会抛 DuplicateKeyException 异常,提示主键重复,不保存当前数据。

  • save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne()db.collection.replaceOne() 来代替。


【示例】使用 insert() 向集合中插入文档

# 创建数据库
>use test1

# 创建集合并插入数据
db.stu1.insert([
{ "_id" : "1001", "name" : "程明", "sex" : "男", "age" : 19, "major" : "英语", "credits" : 52, "score" : 92 },
{ "_id" : "1002", "name" : "刘平", "sex" : "女", "age" : 19, "major" : "数学", "credits" : 51, "score" : 88 },
{ "_id" : "1003", "name" : "张静", "sex" : "女", "age" : 19, "major" : "计算机", "credits" : 48, "score" : 96 },
{ "_id" : "1004", "name" : "李浩", "sex" : "男", "age" : 20, "major" : "数学", "credits" : 53, "score" : 97 },
{ "_id" : "1005", "name" : "张雷", "sex" : "男", "age" : 20, "major" : "计算机", "credits" : 54, "score" : 60 }
])

# 查看集合中的内容
>db.stu1.find()

在这里插入图片描述

也可以将数据定义为一个变量,然后将变量插入到集合中:

# 定义变量document
document=([
{ "_id" : "1001", "name" : "程明", "sex" : "男", "age" : 19, "major" : "英语", "credits" : 52, "score" : 92 },
{ "_id" : "1002", "name" : "刘平", "sex" : "女", "age" : 19, "major" : "数学", "credits" : 51, "score" : 88 },
{ "_id" : "1003", "name" : "张静", "sex" : "女", "age" : 19, "major" : "计算机", "credits" : 48, "score" : 96 },
{ "_id" : "1004", "name" : "李浩", "sex" : "男", "age" : 20, "major" : "数学", "credits" : 53, "score" : 97 },
{ "_id" : "1005", "name" : "张雷", "sex" : "男", "age" : 20, "major" : "计算机", "credits" : 54, "score" : 60 }
]);
# 插入数据
db.stu.insert(document)

# 查看集合中的内容
> db.menu.find()

在这里插入图片描述

插入文档也可以使用 db.collection.save(document) 命令,如果不指定 _id字段 save() 方法类似于 insert() 方法,如果指定_id 字段,则会更新该 _id的数据。


3.2 版本之后新增了 db.collection.insertOne() db.collection.insertMany()。

(1)使用insertOne() 向集合插入一条文档,语法格式如下:

db.collection.insertOne(
   <document>,
   {
      writeConcern: <document>
   }
)

示例:向coll集合中插入一条文档

>use test1
>db.coll.insertOne(
{_id=1,name:"张三",age:18})
>db.coll.find()
# 查询结果如下
{_id=1,name:"张三",age:18}

(2)使用 insertMany() 向集合插入多条文档,语法格式如下:

db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)
  • document: 要写入的文档。
  • writeConcern: 写入策略,默认为 1,即要求确认写操作,0 是不要求。
  • ordered: 指定是否按顺序写入,默认 true,按顺序写入。

示例:向集合中插入多条文档

>use test1
>db.coll.insertMany([
{_id=2,name:"李四",age:18},
{_id=3,name:"王五",age:19},
{_id=4,name:"赵六",age:20}
])
>db.coll.find()
# 查询结果如下
{_id=1,name:"张三",age:18}
{_id=2,name:"李四",age:18}
{_id=3,name:"王五",age:19}
{_id=4,name:"赵六",age:20}

2、更新文档(update、save)


update()方法

update() 方法用于更新现有文档中的值,语法格式如下:

db.collection.update(
    <query>,
    <update>,
    {
        upsert: <boolean>,
        multi: <boolean>,
        writeConcern: <document>
    }
)
  • query: 查询条件,类似 SQL 中 update 语句内 where 后面的内容;
  • update: 更新对象文档和一些更新的操作符(如 $$inc…)等,也可以理解为 SQL 中 update 语句内 set 后面的内容;
  • upsert: 可选项,默认值为 false,用来定义当更新的记录不存在时,是否当作新记录插入到集合中,当值为 true 时表示插入,值为 false 时不插入;
  • multi: 可选项,默认值为 false,用来表示只更新找到的第一条记录,如果为true,把按条件查询出来的记录全部更新;
  • writeConcern: 可选参数,用来定义抛出异常的级别;

更新操作符:


示例:使用 update() 方法修改 集合中title 为“百度” 的文档内容。

# 插入数据
>use test1
>db.ccc.insert([
{_id:1001,title:"百度",url:"111"},
{_id:1002,title:"微博",url:"https://weibo.com"},
])
>db.ccc.update({title:"百度"},{$set:{url:"https://baidu.com"}})

在这里插入图片描述
默认情况下,在使用 update() 方法更新文档时仅会更新一个文档,若想要更新多个文档,则需要将参数“multi”设置为 true,如下所示:

db.course.update({title:"百度"},{$set:{url:"http://www.baidu.com"}},{multi:true})

save()方法

MongoDB 中的 save() 方法可以使用传入的文档来替换已有文档,若 _id 主键存在则更新已有文档,若 _id 主键不存在则作为新数据插入到集合中。语法格式如下:

db.collection_name.save(
    <document>,
    {
        writeConcern: <document>
    }
)
  • document : 文档数据;
  • writeConcern : 可选,抛出异常的级别。

示例:使用save()方法更新集合中_id 为 1001的文档内容。

>db.ccc.save({_id:1001,title:"GitHub同性交友网站",url:"https://github.com"})

在这里插入图片描述

3、删除文档(remove、delete)


remove()方法

在 MongoDB 中,可以使用 remove() 方法从集合中删除文档,语法格式如下:

db.collection.remove(
    <query>,
    {
        justOne: <boolean>,
        writeConcern: <document>
    }
)
  • query: 可选参数,定义要删除文档的条件;
  • justOne: 可选参数,如果设为 true 或 1,则只删除一个文档,如果不设置该参数默认值 false,则删除所有匹配条件的文档;
  • writeConcern: 可选参数,定义抛出异常的级别。

示例:使用 remove() 方法删除集合中 title 为 “微博” 的文档

>db.ccc.remove({title:"微博"})

在这里插入图片描述

delete()方法

清空集合中的所有文档:

db.collection.deleteMany({})

删除所有符合条件的文档:

db.collection.deleteMany({ <field1>: { <operator1>: <value1> }, ... })

仅删除一个符合条件的文档:

db.collection.deleteOne()

4、查询文档(find)


MongoDB 查询文档使用 find() 方法,find()方法以非结构化的方式来显示所有文档,语法格式如下:

db.collection.find(query, projection)
  • query : 可选项,设置查询操作符指定查询条件。
  • projection : 可选项,表示使用投影操作符指定返回的字段,如果忽略此选项则返回所有字段。

除了 find() 方法,还可使用 findOne() 方法,它只返回一个文档。


示例:使用find()查询集合中所有文档,只显示字段name、major和score,不显示_id

>use test1
>db.stu1.find({},{name:1,major:1,score:1,_id:0})
# 查询结果如下
{ "name" : "程明", "major" : "英语", "score" : 92 },
{ "name" : "刘平", "major" : "数学", "score" : 88 },
{ "name" : "张静", "major" : "计算机", "score" : 96 },
{ "name" : "李浩", "major" : "数学", "score" : 97 },
{ "name" : "张雷", "major" : "计算机", "score" : 60 }

find中一些常用的辅助函数

# 统计集合中文档的数量
db.collection.find().count()  

# 以格式化的方式来显示所有文档
db.collection.find().pretty()

# limit()函数与SQL中的作用相同,用于限制查询结果的个数,如下语句只返回3个匹配的结果。
# 若匹配的结果不到 3 个,则返回匹配数量的结果
db.collection.find().limit(3)

# skip()函数用于略过指定个数的文档,如下语句略过第一个文档
db.collection.find().skip(1)

# sort()函数用于对查询结果进行排序,1 是升序,-1 是降序,如下语句可将查询结果升序显示
db.collection.collection().sort({"字段" : 1})

# 使用$regex操作符来设置匹配字符串的正则表达式,不同于全文检索,使用正则表达式无须进行任何配置。
# 如下所示为使用正则表达式查询含有 MongoDB 的文档:
db.test.find({<field>:{$regex:"MongoDB "}})

条件查询

MongoDB 中也支持类似关系型数据库中 where 子句,下表中列举了 MongoDB 中条件查询与关系型数据库中 where 子句的比较:
在这里插入图片描述


AND条件语句

MongoDB 的 find() 方法可以传入多个键(key),每个键以逗号隔开,类似于SQL 语句中的 AND 条件语句。语法格式如下:

db.collection_name.find({$and:[{<key1>:<value1>}, {<key2>:<value2>}], ...})

# 简便写法
db.collection_name.find({<key1>:<value1>,<key2>:<value2>, ...})

示例:在集合中查询“major”=“计算机”同时“sex”=“男”的文档
> use ttt
> db.col.insert([
{ "_id" : "1001", "name" : "程明", "sex" : "男", "age" : 19, "major" : "英语", "credits" : 52, "score" : 92 },
{ "_id" : "1002", "name" : "刘平", "sex" : "女", "age" : 19, "major" : "数学", "credits" : 51, "score" : 88 },
{ "_id" : "1003", "name" : "张静", "sex" : "女", "age" : 19, "major" : "计算机", "credits" : 48, "score" : 96 },
{ "_id" : "1004", "name" : "李浩", "sex" : "男", "age" : 20, "major" : "数学", "credits" : 53, "score" : 97 },
{ "_id" : "1005", "name" : "张雷", "sex" : "男", "age" : 20, "major" : "计算机", "credits" : 54, "score" : 60 }
])
>db.col.find({$and:[{major:"计算机"}, {sex:"男"}]})

在这里插入图片描述
上面的示例等效于SQL语句中的 select * from col where major ='计算机' AND sex='男'。我们可以在 find() 方法中传递任意数量的键/值对。另外,在使用 AND 条件语句时也可以省略其中的 $and 关键字,如下所示:

db.col.find({major:"计算机",sex:"男"})

OR 条件语句

MongoDB 中的 OR 条件语句需要使用 $or 关键字,语法格式如下:

db.collection_name.find({$or:[{<key1>: <value1>}, {<key2>:<value2>}]})

示例:在集合中查询"major"=“计算机"或者"age”=20的文档:

> use ttt
> db.col.insert([
{ "_id" : "1001", "name" : "程明", "sex" : "男", "age" : 19, "major" : "英语", "credits" : 52, "score" : 92 },
{ "_id" : "1002", "name" : "刘平", "sex" : "女", "age" : 19, "major" : "数学", "credits" : 51, "score" : 88 },
{ "_id" : "1003", "name" : "张静", "sex" : "女", "age" : 19, "major" : "计算机", "credits" : 48, "score" : 96 },
{ "_id" : "1004", "name" : "李浩", "sex" : "男", "age" : 20, "major" : "数学", "credits" : 53, "score" : 97 },
{ "_id" : "1005", "name" : "张雷", "sex" : "男", "age" : 20, "major" : "计算机", "credits" : 54, "score" : 60 }
])
>db.col.find({$or:[{major:"计算机"}, {age:20}]})

在这里插入图片描述


AND 和 OR 联合使用

示例:使用 AND 和 OR 条件语句,来实现 SQL 语句中的 select * from col where score> 60 AND major = '计算机' OR major = '数学';

db.stu1.find({score:{$gt:60},$or:[{major:"计算机"},{major:"数学"}]})

在这里插入图片描述

课后练习


插入数据:

use test1

db.stu1.insert([
{ "_id" : "1001", "name" : "程明", "sex" : "男", "age" : 19, "major" : "英语", "credits" : 52, "score" : 92 },
{ "_id" : "1002", "name" : "刘平", "sex" : "女", "age" : 19, "major" : "数学", "credits" : 51, "score" : 88 },
{ "_id" : "1003", "name" : "张静", "sex" : "女", "age" : 19, "major" : "计算机", "credits" : 48, "score" : 96 },
{ "_id" : "1004", "name" : "李浩", "sex" : "男", "age" : 20, "major" : "数学", "credits" : 53, "score" : 97 },
{ "_id" : "1005", "name" : "张雷", "sex" : "男", "age" : 20, "major" : "计算机", "credits" : 54, "score" : 60 },
{ "_id" : "1006", "name" : "王平", "sex" : "女", "age" : 18, "major" : "美术", "credits" : 53, "score" : 97 },
{ "_id" : "1007", "name" : "张宝", "sex" : "男", "age" : 18, "major" : "土木", "credits" : 53, "score" : 97 }
])

在这里插入图片描述

1、查询张宝的信息

db.stu1.find({name:"张宝"})

在这里插入图片描述

2、查询年龄大于19岁的文档

db.stu1.find({age:{$gt:19}})

在这里插入图片描述

3、查询年龄大于等于19岁的男生信息(and操作:db.col.find(){k1:v1,k2:v2})

db.stu1.find({age:{$gte:19},sex:"男"})

在这里插入图片描述

4、查询年龄小于等于19岁,或者性别为男的学生信息

db.stu1.find({$or:[{age:{$lte:19}},{sex:"男"}]})

在这里插入图片描述

5、查询姓张的学生信息

db.stu1.find({name:/^/})

在这里插入图片描述

6、查询姓张的学生姓名和年龄信息

db.stu1.find({name:/^/},{name:1,age:1,_id:0})

在这里插入图片描述

7、查询姓名中有平字的学生信息

db.stu1.find({name://})

在这里插入图片描述

8、查询在数学和计算机专业的学生信息

db.stu1.find({major:{$in:["计算机","数学"]}})

在这里插入图片描述
9、给年龄为18的同学添加家庭住址信息

db.stu1.updateMany({age:18},{$set:{"address":"杭州"}})

或
db.stu1.update({age:18},{$set:{"address":"杭州"}},{multi:true})

在这里插入图片描述
10、删除张宝同学的文档

db.stu1.remove({name:"张宝"})
db.stu1.find()

在这里插入图片描述

查询优化原则:

在查询条件、排序条件、统计条件的字段上选择创建索引,可以显著提高查询效率;

用 $or 时把匹配最多结果的条件放在最前面,用 $and 时把匹配最少结果的条件放在最前面;

使用 limit() 限定返回结果集的大小,减少数据库服务器的资源消耗,以及网络传输的数据量;

尽量少用 $in,而是分解成一个一个的单一查询。尤其是在分片上,$in 会让你的查询去每一个分片上查一次,如果实在要用的话,先在每个分片上建索引;

尽量不用模糊匹配查询,用其它精确匹配查询代替,比如 $i 、$nin;

查询量大、并发大的情况,通过前端加缓存解决;

能不用安全模式的操作就不用安全模式,这样客户端没必要等待数据库返回查询结果以及处理异常,快了一个数量级;

MongoDB 的智能查询优化,判断粒度为 query 条件,而 skip 和 limit 都不在其判断之中,当分页查询最后几页时,先用 order 反向排序;

尽量减少跨分片查询,balance 均衡次数少;

只查询要使用的字段,而不查询所有字段;

更新字段的值时,使用 $inc 比 update 效率高;

apped collections 比普通 collections 的读写效率高;

server-side processing 类似于 SQL 查询的存储过程,可以减少网络通讯的开销;

必要时使用 hint() 强制使用某个索引查询;

如果有自己的主键列,则使用自己的主键列作为 id,这样可以节约空间,也不需要创建额外的索引;

使用 explain ,根据 exlpain plan 进行优化;

范围查询的时候尽量用 $in、$nin 代替;

查看数据库查询日志,具体分析的效率低的操作;

mongodb 有一个数据库优化工具 database profiler,能够检测数据库操作的性能。可以发现 query 或者 write 操作中执行效率低的,从而针对这些操作进行优化;

尽量把更多的操作放在客户端,当然这就是 mongodb 设计的理念之一。
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白豆五

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值