MONGO学习笔记(三、MongoDB CURD)

MongoDB的语法和传统关系型数据库语法不同,它调用的是JavaScript提供的API接口。例如:

添加数据

单行数据插入(insert)

use appdb 
db.book.insert({
  title: 'my first book',
  publishedData : new Date(),
  tags: [
  'MongoDB',
  'nosql'
  ],
  favCount: 25,
  author: 'zale' ,
})
请添加图片描述

WriteResult({ "nInserted" : 1 }) 表示插入数据成功

由于MongoDB属于文档型数据库,它不像关系型数据库一样有着特定的格式,所以你可以在数据库中插入任意结构数据,但不推荐这样做;例如

db.book.insert({
    title:'我的第一本书',
    author:"liuliuliu",
    icon: "这是书的封面",
    utl:'http://book.zhouhc.test.com'
})
请添加图片描述

这时的数据库中:


请添加图片描述

表结构为:


请添加图片描述

无限制的插入,项目必然无法维护。

批量插入

批量插入用到的方法:

db.book.insertMany();

以下是例子:

db.book.insertMany([{
    title:'批量插入',
    author:'zhohc',
    publishedData: new Date(),
    tags:['mongo', '批量插入'],
    favCount: 19
}, {
    title:'批量插入',
    author:'zhohc',
    publishedData: new Date(),
    tags:['mongo', '批量插入'],
    favCount: 19
}])

该语句的执行结果如下:


请添加图片描述
请添加图片描述

当然也可以通过js脚本的方式批量插入数据, 如下:


请添加图片描述

这段js脚本会向MongoDB中插入20条数据.这里就不执行,想试的可以自己去弄。

查询文档(find)

查询全部数据

db.collection.find()方法可以用于集合数据的查询,代码如下:

db.book.find()
请添加图片描述

如果查询返回的条目数量比较多,Mongo shell则会自动实现分批查询,默认情况下每次显示20条数据,可以输入it命令读取下一批。
实际上,find命令返回的是一个游标(cursor)对象,Mongo shell对batchSize做了限制,该大小可以通过变量DBQuery.shellBatchSize修改。
使用游标对象提供的API,可以对全部结果集进行遍历,代码如下:

var cursor = db.book.find()
cursor.forEach(printjson)

执行结果如下:


请添加图片描述

指定条件查询

准备数据

db.aaa.insert({id: 1, user:'zhouhc1', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 2, user:'zhouhc2', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 3, user:'zhouhc3', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 4, user:'zhouhc4', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 5, user:'zhouhc5', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 6, user:'zhouhc6', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 7, user:'zhouhc7', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 8, user:'zhouhc8', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 9, user:'zhouhc9', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 10, user:'zhouhc10', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 11, user:'zhouhc11', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 12, user:'zhouhc12', pwd:'hello', icon: '图标'})

请添加图片描述

几种常见的操作
MongoDB的比较操作符见下表
请添加图片描述

几种逻辑运算符
请添加图片描述

数组运算符


请添加图片描述
  1. 查询id为"1"的用户信息
db.aaa.find({id: 1})
请添加图片描述
  1. 查询用户ID大于5的用户信息
db.aaa.find({id: {$gt: 5}})

该语句执行结果如下:


请添加图片描述
  1. 排序,分页
  • 查询用户ID大于5的用户信息,且按照id降序
    db.aaa.find({id:{$gt: 5}}).sort({id: -1})
    
    该语句执行结果如下:
请添加图片描述
  • 分页查询
    分页查询主要有两个参数

    • skip: 用于指定跳过记录数
    • limit: 用于限定返回结果数

    例如:
    查询id>5的用户,且按照每页2条数据进行分页,取第二页

    db.aaa.find({id: {$gt: 5}}).skip(2).limit(2)
    
请添加图片描述

更新文档(update)

更新操作符

请添加图片描述

请添加图片描述

基本语法格式

MongoDB中可以用update命令对指定的数据进行更新,命令的格式如下:

db.{collection}.update(query, update, options)

参数说明:

  • query: 描述更新的查询条件
  • update: 描述更新的动作以及新的内容
  • options: 描述更新的选项
  1. 更新单条数据
    例如: 将id = 1的用户,用户名修改为liuliuliu,
db.aaa.update({id: 1},{$set: {user: 'liuliuliu'}})

该语句执行结果如下:


请添加图片描述

通过查询,可以看到id=1的数据user已经更新了

请添加图片描述

默认情况下,update命令在更新第一个文档之后返回。(也就是说,默认情况下update命令只更新一个文档),如果需要更新多条数据,如下

  1. 更新多条数据
    更新多条数据用到Options参数multi
    参数介绍
  • multi: 是否更新多条数据,默认false
    基础语法如下:
db.aaa.update(
    {id: {$gt : 10}}, 
    {$set: {user: 'liuliuliu'}},
    {multi: true}
)

上面这个更新语句是说:将所有用户id>10的用户,user修改为liuliuliu

请添加图片描述

通过命令可以看到,id in (11,12)的两条数据已经修改为:liuliuliu了

请添加图片描述
  1. 其他指令
  • updateOne: 更新单个文档

  • updateMany: 更新多个文档

  • replaceOne: 替换单个文档

  • findAndMondify: 这个命令兼容查询和修改指定文档的功能,如下图


    请添加图片描述

    默认返回的是旧数据,可以通过选项: new:true,返回最新的结果
    例如:


    请添加图片描述
  1. 其他
  • upsert命令
    upsert是一种特殊的更新的命令,其表现为如果目标文档不存在,则执行插入命令,代码如下:


    请添加图片描述

删除文档(delete)

删除单个文档

执行下面的命令可以删除单个文档

db.aaa.remove({id:11})

请添加图片描述

可以看到文档已经删除了, 查询结果如下
请添加图片描述

注意:删除命令会删除所有匹配条件的全部文档,如果希望明确限定只删除一个文档,则需要指定justOne参数。
命令格式如下:

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

例如:

db.collection.remove({id: 1}, true)

在MongoDB 3.2版本提供了delete语法定义,因此也可以使用deleteOne命令实现删除单个文档。
例如:

db.aaa.deleteOne({user: 'liuliuliu'})
请添加图片描述

删除全部文档

删除全部文档有三种方式,如下:

db.aaa.remove({})
db.aaa.deleteMany({})
db.aaa.drop()

方式1、2需要对查询范围内的文档逐个删除,如果希望删除整个集合(表),则使用drop命令会更加高效。
drop命令会同时删除集合的全部索引。

返回被删除的数据

如果希望返回删除的数据可以使用命令:findOneAndDelete命令, 示例如下:

db.aaa.findOneAndDelete({id: 10})

执行结果如下:


请添加图片描述

小结

请添加图片描述

参考

《MongoDB进阶与实战:微服务整合、性能优化、架构管理》

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容