Sun's blog Sun's blog
首页
  • HTML
  • CSS
  • JavaScript基础
  • JavaScript高级
  • Git
  • Webpack
  • Vite
  • Vue
  • React
  • Node

    • Node基础
    • Nest
  • Flutter基础

    • 00.Dart环境搭建
    • 01.Dart入口注释变量常量命名规则
    • 02.Dart的数据类型详解int double String bool List Maps
    • 03.Dart运算符 条件表达式 Dart类型转换
    • 04.Dart循环语句 for while do while break continue多维列表循环
    • 05.Dart 集合类型List Set Map详解 以及循环语句 forEach map where any every
  • Go基础

    • Go语言基础
  • mongodb

    • mongodb
    • mongoose
  • mysql

    • mysql
    • sequelize
  • redis

    • redis
  • Linux
  • Nginx
  • 学习方法

    • 费曼学习法
    • 笔记方法
    • 提高学习效率的策略
    • 提高记忆的技巧
  • 前端常用

    • 常用网站
    • 常用的前端轮子
    • 面试问题
    • Markdown
  • 友情链接

    • 友情链接
  • 日语
  • 英语

    • 国际音标
    • 新概念第一册
  • 小滴课堂

    • 后端项目
    • 前端项目
    • 后台管理
    • Nuxt的基础使用
    • Linux安装环境
    • Node基础
GitHub (opens new window)

Sun Tang

何以解忧,唯有不断学习变强,强大才可以无惧一切!
首页
  • HTML
  • CSS
  • JavaScript基础
  • JavaScript高级
  • Git
  • Webpack
  • Vite
  • Vue
  • React
  • Node

    • Node基础
    • Nest
  • Flutter基础

    • 00.Dart环境搭建
    • 01.Dart入口注释变量常量命名规则
    • 02.Dart的数据类型详解int double String bool List Maps
    • 03.Dart运算符 条件表达式 Dart类型转换
    • 04.Dart循环语句 for while do while break continue多维列表循环
    • 05.Dart 集合类型List Set Map详解 以及循环语句 forEach map where any every
  • Go基础

    • Go语言基础
  • mongodb

    • mongodb
    • mongoose
  • mysql

    • mysql
    • sequelize
  • redis

    • redis
  • Linux
  • Nginx
  • 学习方法

    • 费曼学习法
    • 笔记方法
    • 提高学习效率的策略
    • 提高记忆的技巧
  • 前端常用

    • 常用网站
    • 常用的前端轮子
    • 面试问题
    • Markdown
  • 友情链接

    • 友情链接
  • 日语
  • 英语

    • 国际音标
    • 新概念第一册
  • 小滴课堂

    • 后端项目
    • 前端项目
    • 后台管理
    • Nuxt的基础使用
    • Linux安装环境
    • Node基础
GitHub (opens new window)
  • mongodb

    • mongodb
      • mongoose
    • mysql

    • redis

    • 数据库
    • mongodb
    Sun
    2022-03-06

    mongodb

    # mongodb 数据库

    # 创建数据库、查看、删除数据库

    # 1. 查看数据库有哪些

    show dbs
    
    1

    # 2. 使用数据库、创建数据库

    use xiaomi
    
    1

    如果真的想给这个数据库创建成功,那么必须插入一个数据。

    数据库中不能直接插入数据,只能往集合(collections)中插入数据。下面命令表示给 xiaomi 数据库的 user 表中插入数据

    db.user.insert({ name: 'xiaoming' })
    
    1

    # 3. 查看当前数据库里有哪些表

    show collections
    
    1

    # 4. 删除集合,删除指定的集合,删除表

    db.user.drop()
    
    1

    # 5. 删除数据库,删除当前的数据库

    db.dropDatabase()
    
    1

    # 插入(增加)数据

    插入数据,随着数据的插入,数据库创建成功了,集合也创建成功了。

    db.表名.insert({"name":"zhangsan","age":20});
    
    1

    # 查找数据

    # 1. 查询所有数据

    db.user.find()
    
    1

    # 2. 查询去掉后的当前聚集集合中的某列的重复数据

    db.user.distinct('name')
    
    1

    会过滤掉 name 中的相同数据

    相当于: select distict name from user

    # 3. 查询 age = 22 的记录

    db.user.find({ age: 22 })
    
    1

    相当于: select * from user where age = 22

    # 4. 查询 age > 22 的记录

    db.user.find({ age: { $gt: 22 } })
    
    1

    相当于: select * from user where age > 22

    # 5. 查询 age < 22 的记录

    db.user.find({ age: { $lt: 22 } })
    
    1

    相当于:select * from user where age < 22

    # 6. 查询 age >= 25 的记录

    db.user.find({ age: { $gte: 25 } })
    
    1

    相当于: select * from user where age >= 25

    # 7. 查询 age <= 25 的记录

    db.user.find({ age: { $lte: 25 } })
    
    1

    相当于: select * from user where age <= 25

    # 8. 查询 age >= 23 并且 age <= 26 注意书写格式

    db.user.find({ age: { $gte: 23, $lte: 26 } })
    
    1

    # 9. 查询 name 中包含 mongo 的数据 模糊查询用于搜索

    db.user.find({ name: /mongo/ })
    
    1

    相当于%%: select * from user where name like ‘%zhang%’

    # 10. 查询 name 中以 mongo 开头的

    db.user.find({ name: /^mongo/ })
    
    1

    相当于:select * from user where name like ‘mongo%’

    # 11. 查询 name 中以 mongo 结尾的

    db.user.find({ name: /mongo$/ })
    
    1

    # 12. 查询指定列 name、age 数据

    db.user.find({}, { name: 1, age: 1 })
    
    1

    相当于:select name, age from user;

    当然 name 也可以用 true 或 false,当用 ture 的情况下河 name:1 效果一样,如果用 false 就是排除 name,显示 name 以外的列信息。

    # 13. 查询指定列 name、age 数据**, age > 25**

    db.user.find({ age: { $gt: 25 } }, { name: 1, age: 1 })
    
    1

    相当于: select name, age from user where age >25

    # 14. 按照年龄排序 1 升序 -1 降序

    升序

    db.user.find().sort({ age: 1 })
    
    1

    降序

    db.user.find().sort({ age: -1 })
    
    1

    # 15. 查询 name = zhangsan, age = 22 的数据

    db.user.find({ name: 'zhangsan', age: 22 })
    
    1

    相当于: select * from user where name = ‘zhangsan’ and age = ‘22’

    # 16. 查询前 5 条数据

    db.user.find().limit(5)
    
    1

    相当于: selecttop 5 * from user

    # 17. 查询 10 条以后的数据

    db.user.find().skip(10)
    
    1

    # 18. 查询在 5-10 之间的数据

    db.user
      .find()
      .limit(10)
      .skip(5)
    
    1
    2
    3
    4

    可用于分页,limit 是 pageSize,skip 是(page-1)*pageSize

    # 19. or 与 查询

    db.user.find({ $or: [{ age: 22 }, { age: 25 }] })
    
    1

    相当于: select * from user where age = 22 or age = 25

    # 20. findOne 查询第一条数据

    db.user.findOne()
    
    1

    相当于:

    selecttop 1 * from user

    db.user.find().limit(1)

    # 21. 查询某个结果集的记录条数 统计数量

    db.user.find({ age: { $gte: 25 } }).count()
    
    1

    相当于: select count(*) from user where age >= 20

    如果要返回限制之后的记录数量,要使用 count(true)或者 count(非 0)

    db.users.find().skip(10).limit(5).count(true)

    # 修改数据

    修改里面还有查询条件。你要该谁,要告诉 mongo。

    # 1. 查找名字叫做小明的,把年龄更改为 16 岁

    db.student.update({ name: '小明' }, { $set: { age: 16 } })
    
    1

    # 2. 查找数学成绩是 70,把年龄更改为 33 岁

    db.student.update({ 'score.shuxue': 70 }, { $set: { age: 33 } })
    
    1

    # 3. 更改所有匹配项目

    multi: true 触发 一次修改多条数据,不然一次只会修改一条。

    db.student.update({ sex: '男' }, { $set: { age: 33 } }, { multi: true })
    
    1

    # 4. 完整替换,不出现$set 关键字了

    db.student.update({ name: '小明' }, { name: '大明', age: 16 })
    
    1

    # 5. 特殊

    db.users.update({ name: 'Lisi' }, { $inc: { age: 50 } }, false, true)
    
    1

    相当于:update users set age = age + 50 where name = ‘Lisi’;

    # 6. 特殊

    db.users.update(
      { name: 'Lisi' },
      { $inc: { age: 50 }, $set: { name: 'hoho' } },
      false,
      true
    )
    
    1
    2
    3
    4
    5
    6

    相当于:update users set age = age + 50, name = ‘hoho’ where name = ‘Lisi’;

    # 删除数据

    # 1. 删除所有条件内的数据

    db.users.remove({ age: 132 })
    
    1

    # 2. 删除条件内的一条数据

    db.users.remove({ age: 132 }, { justOne: true })
    
    1

    # 索引、大数据查询优化

    # 1. 索引基础

    索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得 更快。MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查 询优化技巧。

    # 创建索引
    db.user.ensureIndex({ userame: 1 })
    
    1
    # 获取当前集合的索引
    db.user.getIndexes()
    
    1
    # 删除索引
    db.user.dropIndex({ username: 1 })
    
    1
    # 复合索引

    数字 1 表示 username 键的索引按升序存储,-1 表示 age 键的索引按照降序方式存储。

    db.user.ensureIndex({ username: 1, age: -1 })
    
    1

    该索引被创建后,基于 username 和 age 的查询将会用到该索引,或者是基于 username 的查询也会用到该索引,但是只是基于 age 的查询将不会用到该复合索引。因此可以说, 如果想用到复合索引,必须在查询条件中包含复合索引中的前 N 个索引列。然而如果查询 条件中的键值顺序和复合索引中的创建顺序不一致的话,MongoDB 可以智能的帮助我们调 整该顺序,以便使复合索引可以为查询所用。如:

    db.user.find({ age: 30, username: 'stephen' })
    
    1

    对于上面示例中的查询条件,MongoDB 在检索之前将会动态的调整查询条件文档的顺 序,以使该查询可以用到刚刚创建的复合索引。

    对于上面创建的索引,MongoDB 都会根据索引的 keyname 和索引方向为新创建的索引 自动分配一个索引名,下面的命令可以在创建索引时为其指定索引名,如:

    db.user.ensureIndex({ username: 1 }, { name: 'userindex' })
    
    1

    随着集合的增长,需要针对查询中大量的排序做索引。如果没有对索引的键调用 sort, MongoDB 需要将所有数据提取到内存并排序。因此在做无索引排序时,如果数据量过大以 致无法在内存中进行排序,此时 MongoDB 将会报错。

    # 2. 唯一索引

    在缺省情况下创建的索引均不是唯一索引。下面的示例将创建唯一索引,如:

    db.user.ensureIndex({ userid: 1 }, { unique: true })
    
    1

    如果再次插入 userid 重复的文档时,MongoDB 将报错,以提示插入重复键,如:

    db.user.insert({ userid: 5 })
    db.user.insert({ userid: 5 })
    
    1
    2

    E11000 duplicate key error index: user.user.$userid_1 dup key: { : 5.0 }

    如果插入的文档中不包含 userid 键,那么该文档中该键的值为 null,如果多次插入类似 的文档,MongoDB 将会报出同样的错误,如:

    db.user.insert({ userid1: 5 })
    db.user.insert({ userid1: 5 })
    
    1
    2

    E11000 duplicate key error index: user.user.$userid_1 dup key: { : null }

    如果在创建唯一索引时已经存在了重复项,我们可以通过下面的命令帮助我们在创建唯 一索引时消除重复文档,仅保留发现的第一个文档,如:

    先删除刚刚创建的唯一索引。

    db.user.dropIndex({ userid: 1 })
    
    1

    插入测试数据,以保证集合中有重复键存在。

    db.user.remove()
    db.user.insert({ userid: 5 })
    db.user.insert({ userid: 5 })
    
    1
    2
    3

    重新创建唯一索引

    db.user.ensureIndex({ userid: 1 }, { unique: true })
    
    1

    我们同样可以创建复合唯一索引,即保证复合键值唯一即可。如:

    db.user.ensureIndex({ userid: 1, age: 1 }, { unique: true })
    
    1

    # 3. 索引的一些参数

    parameter type Description
    Background Boolean 建索引过程会阻塞其它数据库操作,Background 可置顶以后后台方式创建索引,即增加 “Background”可选参数。"Background" 默认值为 false。
    unique Boolean 建立的索引是否唯一。指定为 true 创建唯一索引。默认值为 false。
    name String 索引的名称。如果未指定,MongoDB 的通过连接索引的字段名和排序顺序生成一个索引名称。
    dropDups Boolean 在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false。

    如果在为已有数据的文档创建索引时,可以执行下面的命令,以使 MongoDB 在后台创 建索引,这样的创建时就不会阻塞其他操作。但是相比而言,以阻塞方式创建索引,会使整 个创建过程效率更高,但是在创建时 MongoDB 将无法接收其他的操作。

    db.user.ensureIndex({ username: 1 }, { background: true })
    
    1

    # 4. 使用 explain

    explain 是非常有用的工具,会帮助你获得查询方面诸多有用的信息。只要对游标调用

    该方法,就可以得到查询细节。explain 会返回一个文档,而不是游标本身。如:

    db.tablename.find().explain()
    
    1

    explain 会返回查询使用的索引情况,耗时和扫描文档数的统计信息。

    # 5. explain executionStats 查询具体的执行时间

    db.tablename.find().explain('executionStats')
    
    1

    关注输出的如下数值: explain.executionStats.executionTimeMillis

    编辑 (opens new window)
    上次更新: 2024/04/20, 18:53:06
    mongoose

    mongoose→

    最近更新
    01
    Node基础
    07-23
    02
    05.Dart 集合类型List Set Map详解 以及循环语句 forEach map where any every
    05-08
    03
    04.Dart循环语句 for while do while break continue多维列表循环
    05-08
    更多文章>
    Theme by Vdoing | Copyright © 2019-2024 Sun Tang | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式