MongoDB学习笔记
MongoDB、Redis 非关系型数据库,非关系型数据库, 称为NoSQL ,键值对存储的形似,适合存储海量的数据
学习MongoDB时,和MySQL有些变化
- 数据库
- 集合(对应MySQL中的数据表)
- 文档(对应MySQL中的记录)
- 域(对应MySQL中的字段)
1 MongoDB命令
开启客户端 sudo mongo (前提开启服务器)
查看数据库 show dbs 或者 show databases
查看使用的数据库 db
切换数据库 use 数据库名字
创建数据库 use 数据库名字
删除数据库 db.dropDatabase()
注意:
-
如果数据库不存在,则创建数据库,否则切换到指定数据库
-
刚创建的数据库并不在数据库的列表中,如 要显示它,需要向数据库中插入一些数据,才会看到刚刚创建的数据库(即如果创建了数据库没有数据,show dbs看不到)
-
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中
集合相关命令:
查看当前数据库中的所有集合(数据表)
show collections
手动创建集合
db.createCollection(name, options)
demo :
db.createCollection("stu")
demo2:
db.createCollection("stu", {capped:true, size: 10})
说明:
-
参数capped: 默认值为false表示不设置上限,值为true表示设置上限
-
参数size: 当capped值为true时, 需要指定此参数, 表示上限⼤⼩,当⽂档达到上限时, 会将之前的数据覆盖, 单位为字节
-
查询集合上限与否
db.集合名.isCapped()
删除集合:
db.集合名.drop()
2 MongoDB 中常见数据类型
Object ID: ⽂档ID
String: 字符串, 最常⽤, 必须是有效的UTF-8
Boolean: 存储⼀个布尔值, true或false
Integer: 整数32位或64位, 这取决于服务器
Double: 存储浮点值
Arrays: 数组或列表, 多个值存储到⼀个键
Object: ⽤于嵌⼊式的⽂档, 即⼀个值为⼀个⽂档
Null: 存储Null值
Timestamp: 时间戳, 表示从1970-1-1到现在的总秒数
Date: 存储当前⽇期或时间的UNIX时间格式
注意点:
object ID 中是一个12个字节的十六进制数,24位的字符串,它并不是一个随机数,每一对字节都有含义。 其中 前4个字节 8个字符是一个 ‘时间戳’, 接下来3个字节 ‘机器ID’ 往后2个字节是 MongoDB 的服务进程id , 最后三个字节是一个‘ 增值量’
3 MongoDB 增删改查
增:
MongoDB 使用 insert() 或 save() 向集合中添加(插入)文档
db.集合名称.insert({"键":“值”})
db.集合名称.save({"键":"值"})
demo:
查:
db.集合名称.find()
易读方式查询 db.集合名称.find().pretty()
改(更新):
db.集合名称.update(<query>, <update>,{multi: <boolean>})
说明:
- 参数query:查询条件
- 参数update:更新操作符
- 参数multi:可选, 默认是false,表示只更新找到的第⼀条记录, 值为true表示把满⾜条件的⽂档全部更新
demo:
db.student.update({"name":"二哈"},{"name":"哈哈"})
demo:指定键值更新操作
db.stu.update({name:'hr'},{$set:{name:'hys'}})
demo:更新全部
db.stu.update({},{$set:{gender:0}},{multi:true})
删:
db.集合名称.remove(<query>, {"justOne":<boolean>})
说明:
- 参数query:可选,删除的⽂档的条件
- 参数justOne:可选, 如果设为true或1, 则只删除⼀条, 默认false, 表示删除多条
demo:
db.student.remove({"name":"xxxx"})
进阶查询
数据准备:
{"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true }
{"name" : "⻩蓉", "hometown" : "桃花岛", "age" : 18, "gender" : false }
{"name" : "华筝", "hometown" : "蒙古", "age" : 18, "gender" : false }
{"name" : "⻩药师", "hometown" : "桃花岛", "age" : 40, "gender" : true }
{"name" : "段誉", "hometown" : "⼤理", "age" : 16, "gender" : true }
{"name" : "段王爷", "hometown" : "⼤理", "age" : 45, "gender" : true }
{"name" : "洪七公", "hometown" : "华⼭", "age" : 18, "gender" : true }
# 一次性插入
db.stu.insertMany([{"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true },{"name" : "⻩蓉", "hometown" : "桃花岛", "age" : 18, "gender" : false },{"name" : "华筝", "hometown" : "蒙古", "age" : 18, "gender" : false },{"name" : "⻩药师", "hometown" : "桃花岛", "age" : 40, "gender" : true },{"name" : "段誉", "hometown" : "⼤理", "age" : 16, "gender" : true },{"name" : "段王爷", "hometown" : "⼤理", "age" : 45, "gender" : true },{"name" : "洪七公", "hometown" : "华⼭", "age" : 18, "gender" : true }])
db.student.findOne({文档条件}) 查询一条数据
1 比较运算符
-
等于: 默认是等于判断, 没有运算符
-
⼩于:
$lt (less than)
-
⼩于等于:
$lte (less than equal)
-
⼤于:
$gt (greater than)
-
⼤于等于:
$gte
-
不等于:
$ne
demo:
db.集合名.find({age:{$gte:18}})
查询大于等于 18年龄的信息
2 逻辑运算符
-
and 查询,在json中写多个条件
查询年龄大于等于18 并且 gender 等于true
db.student.find({age:{$gte:18},gender:true})
- or 查询
查询年龄⼤于18, 或性别为false的学⽣
db.student.find({$or:[{age:{$gt:18}},{gender:false}]})
查询年龄⼤于18或性别为男⽣, 并且姓名是郭靖
db.student.find({$or:[{age:{$gt:18}},{gender:true}],"name":"郭靖"})
3 范围查询
使⽤$in
, $nin
判断数据是否在某个数组内(非连续性的)
查询年龄为18、28的学生
db.student.find({age:{$in:[18,28]}})
4 自定义查询
db.stu.find({
$where:function() {
return this.age>30;
}
})
高级用法
1 limit() 读取文档的数量
获取2条学生的信息
db.student.find().limit(2)
2 skip() 用于跳过指定数量的文档
跳过前两个从第三个开始
db.student.find().skip(2)
3 skip和limit结合使用
先使用skip再使用limit 效率更高
db.student.find().skip(2).limit(3)
4 投影--- 在查询到的返回结果中,只选择必要的字段
命令:
db.集合名称.find({},{field:1,...})
说明:
- 参数为字段和值, 值为
1
表示显示, 值为0
不显 - 特别注意: 对于
_id
列默认是显示的, 如果不显示需要明确设置为0
demo:
db.student.find({},{_id:0,name:1,gender:1})
5 排序 sort()
db.student.find().sort({域:1.....})
说明:
- 参数
1
为升序排列(从小到大) 参数-1
为降序排列(从大到小)
6 统计个数 count()
db.student.find().count({条件})
7 消除重复
db.集合名称.distince("去重字段", {条件})
demo:
db.student.distinct("hometown",{age:{$gt:18}})
聚合函数
1 group分组
2 match数据过滤
4 索引
目的: 在查询数据中,如果有大量的数据时,为了能够加快速度的查询,那么我们就需要创建索引。
建立索引的注意点:
-
根据需要选择是否需要建立唯一索引
-
数据量巨大并且数据库的读出操作非常频繁的时候才需要创建索引,如果写入操作非常频繁,创建索引会影响写入速度
-
索引字段是升序还是降序在单个索引的情况下不影响查询效率,但是在复合索引的条件下会有影响
在进行查询的时候如果字段1需要升序的方式排序输出,字段2需要降序的方式排序输出,那么此时复合索引的建立需要把字段
5 MongoDB数据库备份
备份
保证数据库安全,主要用于灾难处理
备份的语法:mongodump -h dbhost -d dbname -o dbdirectory
-h
: 服务器地址, 也可以指定端⼝号-d
: 需要备份的数据库名称-o
: 备份的数据存放位置, 此⽬录中存放着备份出来的数据
示例:mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
恢复
恢复语法:mongorestore -h dbhost -d dbname --dir dbdirectory
-h
: 服务器地址-d
: 需要恢复的数据库实例--dir
: 备份数据所在位置
示例:mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1
6 MongoDB与Python交互
安装
pip install pymongo
使用pymongo
导入pymongo并选择要操作的集合
数据库和集合如果没有会自动创建
from pymongo import MongoClient
client = MongoClient(host,port)
collection = client[db名][集合名]