mongodb
# mongodb 数据库
# 创建数据库、查看、删除数据库
# 1. 查看数据库有哪些
show dbs
# 2. 使用数据库、创建数据库
use xiaomi
如果真的想给这个数据库创建成功,那么必须插入一个数据。
数据库中不能直接插入数据,只能往集合(collections)中插入数据。下面命令表示给 xiaomi 数据库的 user 表中插入数据
db.user.insert({ name: 'xiaoming' })
# 3. 查看当前数据库里有哪些表
show collections
# 4. 删除集合,删除指定的集合,删除表
db.user.drop()
# 5. 删除数据库,删除当前的数据库
db.dropDatabase()
# 插入(增加)数据
插入数据,随着数据的插入,数据库创建成功了,集合也创建成功了。
db.表名.insert({"name":"zhangsan","age":20});
# 查找数据
# 1. 查询所有数据
db.user.find()
# 2. 查询去掉后的当前聚集集合中的某列的重复数据
db.user.distinct('name')
会过滤掉 name 中的相同数据
相当于: select distict name from user
# 3. 查询 age = 22 的记录
db.user.find({ age: 22 })
相当于: select * from user where age = 22
# 4. 查询 age > 22 的记录
db.user.find({ age: { $gt: 22 } })
相当于: select * from user where age > 22
# 5. 查询 age < 22 的记录
db.user.find({ age: { $lt: 22 } })
相当于:select * from user where age < 22
# 6. 查询 age >= 25 的记录
db.user.find({ age: { $gte: 25 } })
相当于: select * from user where age >= 25
# 7. 查询 age <= 25 的记录
db.user.find({ age: { $lte: 25 } })
相当于: select * from user where age <= 25
# 8. 查询 age >= 23 并且 age <= 26 注意书写格式
db.user.find({ age: { $gte: 23, $lte: 26 } })
# 9. 查询 name 中包含 mongo 的数据 模糊查询用于搜索
db.user.find({ name: /mongo/ })
相当于%%: select * from user where name like ‘%zhang%’
# 10. 查询 name 中以 mongo 开头的
db.user.find({ name: /^mongo/ })
相当于:select * from user where name like ‘mongo%’
# 11. 查询 name 中以 mongo 结尾的
db.user.find({ name: /mongo$/ })
# 12. 查询指定列 name、age 数据
db.user.find({}, { name: 1, age: 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 })
相当于: select name, age from user where age >25
# 14. 按照年龄排序 1 升序 -1 降序
升序
db.user.find().sort({ age: 1 })
降序
db.user.find().sort({ age: -1 })
# 15. 查询 name = zhangsan, age = 22 的数据
db.user.find({ name: 'zhangsan', age: 22 })
相当于: select * from user where name = ‘zhangsan’ and age = ‘22’
# 16. 查询前 5 条数据
db.user.find().limit(5)
相当于: selecttop 5 * from user
# 17. 查询 10 条以后的数据
db.user.find().skip(10)
# 18. 查询在 5-10 之间的数据
db.user
.find()
.limit(10)
.skip(5)
2
3
4
可用于分页,limit 是 pageSize,skip 是(page-1)*pageSize
# 19. or 与 查询
db.user.find({ $or: [{ age: 22 }, { age: 25 }] })
相当于: select * from user where age = 22 or age = 25
# 20. findOne 查询第一条数据
db.user.findOne()
相当于:
selecttop 1 * from user
db.user.find().limit(1)
# 21. 查询某个结果集的记录条数 统计数量
db.user.find({ age: { $gte: 25 } }).count()
相当于: 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 } })
# 2. 查找数学成绩是 70,把年龄更改为 33 岁
db.student.update({ 'score.shuxue': 70 }, { $set: { age: 33 } })
# 3. 更改所有匹配项目
multi: true 触发 一次修改多条数据,不然一次只会修改一条。
db.student.update({ sex: '男' }, { $set: { age: 33 } }, { multi: true })
# 4. 完整替换,不出现$set 关键字了
db.student.update({ name: '小明' }, { name: '大明', age: 16 })
# 5. 特殊
db.users.update({ name: 'Lisi' }, { $inc: { age: 50 } }, false, true)
相当于:update users set age = age + 50 where name = ‘Lisi’;
# 6. 特殊
db.users.update(
{ name: 'Lisi' },
{ $inc: { age: 50 }, $set: { name: 'hoho' } },
false,
true
)
2
3
4
5
6
相当于:update users set age = age + 50, name = ‘hoho’ where name = ‘Lisi’;
# 删除数据
# 1. 删除所有条件内的数据
db.users.remove({ age: 132 })
# 2. 删除条件内的一条数据
db.users.remove({ age: 132 }, { justOne: true })
# 索引、大数据查询优化
# 1. 索引基础
索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得 更快。MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查 询优化技巧。
# 创建索引
db.user.ensureIndex({ userame: 1 })
# 获取当前集合的索引
db.user.getIndexes()
# 删除索引
db.user.dropIndex({ username: 1 })
# 复合索引
数字 1 表示 username 键的索引按升序存储,-1 表示 age 键的索引按照降序方式存储。
db.user.ensureIndex({ username: 1, age: -1 })
该索引被创建后,基于 username 和 age 的查询将会用到该索引,或者是基于 username 的查询也会用到该索引,但是只是基于 age 的查询将不会用到该复合索引。因此可以说, 如果想用到复合索引,必须在查询条件中包含复合索引中的前 N 个索引列。然而如果查询 条件中的键值顺序和复合索引中的创建顺序不一致的话,MongoDB 可以智能的帮助我们调 整该顺序,以便使复合索引可以为查询所用。如:
db.user.find({ age: 30, username: 'stephen' })
对于上面示例中的查询条件,MongoDB 在检索之前将会动态的调整查询条件文档的顺 序,以使该查询可以用到刚刚创建的复合索引。
对于上面创建的索引,MongoDB 都会根据索引的 keyname 和索引方向为新创建的索引 自动分配一个索引名,下面的命令可以在创建索引时为其指定索引名,如:
db.user.ensureIndex({ username: 1 }, { name: 'userindex' })
随着集合的增长,需要针对查询中大量的排序做索引。如果没有对索引的键调用 sort, MongoDB 需要将所有数据提取到内存并排序。因此在做无索引排序时,如果数据量过大以 致无法在内存中进行排序,此时 MongoDB 将会报错。
# 2. 唯一索引
在缺省情况下创建的索引均不是唯一索引。下面的示例将创建唯一索引,如:
db.user.ensureIndex({ userid: 1 }, { unique: true })
如果再次插入 userid 重复的文档时,MongoDB 将报错,以提示插入重复键,如:
db.user.insert({ userid: 5 })
db.user.insert({ userid: 5 })
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 })
2
E11000 duplicate key error index: user.user.$userid_1 dup key: { : null }
如果在创建唯一索引时已经存在了重复项,我们可以通过下面的命令帮助我们在创建唯 一索引时消除重复文档,仅保留发现的第一个文档,如:
先删除刚刚创建的唯一索引。
db.user.dropIndex({ userid: 1 })
插入测试数据,以保证集合中有重复键存在。
db.user.remove()
db.user.insert({ userid: 5 })
db.user.insert({ userid: 5 })
2
3
重新创建唯一索引
db.user.ensureIndex({ userid: 1 }, { unique: true })
我们同样可以创建复合唯一索引,即保证复合键值唯一即可。如:
db.user.ensureIndex({ userid: 1, age: 1 }, { unique: true })
# 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 })
# 4. 使用 explain
explain 是非常有用的工具,会帮助你获得查询方面诸多有用的信息。只要对游标调用
该方法,就可以得到查询细节。explain 会返回一个文档,而不是游标本身。如:
db.tablename.find().explain()
explain 会返回查询使用的索引情况,耗时和扫描文档数的统计信息。
# 5. explain executionStats 查询具体的执行时间
db.tablename.find().explain('executionStats')
关注输出的如下数值: explain.executionStats.executionTimeMillis