MongoDB的使用
数据库的操作
库操作
-
查看所有数据库:show databases;或者show dbs;
-
查看当前所在数据库:db;
-
创建数据库:mongodb是隐式创建的,就是所有的库和集合这些都不用事先创建,只需要往其中插入数据,就会自动创建了
-
切换数据库: use db_name;
-
删除数据库,use切换到你要上删除的数据库, 然后db.dropDatabase(),慎用,慎用,慎用!!!
集合操作
- 不手动创建集合,向不存在的集合中第一次插入数据的时候,集合就会被创建出来
- 手动创建集合db.createCollection(col_name);例:
- db.createCollection("students");,创建无上限的集合
- db.createCollection('students', {capped:true, size:100});,创建有上限的集合
- 参数capped: 默认值为false,表示不设置上限,值为true时表示设置上限
- 参数size: 当capped为true时,需要设置这个参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节
- 查看集合:show tables或者show collections;
- 删除集合:db.col_name.drop();,慎用,慎用,慎用!!!
MongoDB中可以存储的数据类型
- Object ID: 文档ID,就是我们存入数据库的一条一条的数据(json字符串),每一条数据都有唯一的一个_id,用来保证数据的唯一性,这个id如果我们没有指定的时候,MongoDB会自动给我们生成,所有MongoDB中是可以插入重复数据的
- object ID是一个12字节的十六进制数
{ "_id" : ObjectId("5cc7c827ca11d7964bf34682"), "name" : "xxx", "age" : 23, "gender" : "男", "date" : ISODate("2019-04-20T00:00:00Z") }- 前四个字节是当前时间戳
- 接下来的3个字节是机器ID
- 接下来的2个字节是MongoDB中的进程id
- 最后3个字节是简单的增量值
- object ID是一个12字节的十六进制数
- String: 字符串,也是最常用的,必须是有效的UTF-8
- Boolean:存储⼀个布尔值, true或false
- Integer:整数可以是32位或64位,这取决于服务器
- Double: 存储浮点值
- Arrays: 数组或列表, 多个值存储到⼀个键
- Object: ⽤于嵌⼊式的⽂档, 即⼀个值为⼀个⽂档
- Null: 存储Null值
- Timestam: 时间戳,表示从1970-1-1到现在的总秒数
- Date: 存储当前⽇期或时间的UNIX时间格式
- 创建日期:new Data('2019-04-20'),参数的格式为YYYY-MM-DD
> new Date("2019-04-20")
ISODate("2019-04-20T00:00:00Z") - 当我们要在python中插入这个格式的时间时,可以使用datetime
In [7]: import datetime
In [8]: datetime.datetime.now()
Out[8]: datetime.datetime(2019, 4, 30, 12, 4, 3, 747476)
In [9]:
- 创建日期:new Data('2019-04-20'),参数的格式为YYYY-MM-DD
集合中数据的操作(CRUD)
添加数据
- 插入单条数据: db.col_name.insert({'name':'yyy', 'age':22, 'date':new Date("2019-03-11")}), 插入的数据可以写成个字典插入或者json字符串,_id存在就报错
- 插入多条数据: db.col_name.insert([{key:value, key1:value1...},{key:value, key1:value1...},{},{}...... ]), 每一条数据都是一个字典或者json字符串,_id存在就报错
- 保存 :db.col_name.save({}),如果文档中的id已经存在就修改,如果文档id不存在则添加,id存在就修改
修改数据
- db.xxx.update({name:'xiaohua'},{name:'xiaomei'}),把name为xiaohua的整条数据修改成name为xiaomei, 基本不会这样用
- db.xxx.update({name:'xiaohua'},{$set{age:'21'}}),把name为xiaohua的数据的age值修改为99, 只修改name的值,其他字段信息不变, 默认修改一条
- db.xxx.update({name:'xiaohua'},{$set{age:'22'}}, {multi:true}),会把name为xiaohua的所有数据的age值改为22,修改符合条件的所有数据的值
- 注意! multi只能和$一起使用
删除数据
-
db.集合名称.remove(<删除条件>,{justOne:
}) boolean为false时,表示删除全部,为true时删除一条 -
db.col_name.remove({})删除集合中的所有数据,慎用,慎用,慎用!!!
-
db.xxx.remove({age:20}, {justOne:true}): 删除一条满足条件的
-
db.xxx.remove({age:20}, {justOne:false}): 删除所有满足条件的
查询数据
- db.集合名称.find({条件⽂档})
- db.xxx.find({}):查询所有集合中的文档
- db.xxx.findOne({name:'xiaohua'}) : 查询name为xiaohua的第一条数据
- db.xxx.find({name:'xiaohua'}).pretty(): 查询name为xiaohua的所有数据, pretty()把查询结果美化输出
- db.xxx.find({name:'xiaohua'}, {_id:false})查询所有name为xiaohua的数据,指定查询结果不显示_id,查询时通过指定字段为false还是true可以控制输出哪些要显示的信息
- 查询中的比较运算符
- 等于: 默认是等于判断,没有运算符
- 上面的所有查询都是等于操作
- 大于:$gt
- db.xxx.find({age:{$gt:22}})查询所有age大于22的数据
- 大于等于: $gte
- db.xxx.find({age:{$gte:22}}) 查询所有age大于等于22的数据
- 小于: $lt
- db.xxx.find({age:{$lt:20}}) 查询所有age小于20的数据
- 小于等于: $lte
- db.xxx.find({age:{$lte:20}})查询所有age小于等于20的数据
- 不等于: $ne
- db.xxx.find({age:{$ne:20}}) 查询所有age不等于20的数据
- 等于: 默认是等于判断,没有运算符
- 范围运算符
- 判断是否在某个范围内:$nin
- db.xxx.find(age{$in:[18,20,25]}) 查询age为18,20,25的所有数据
- db.xxx.find(age{age{$nin:[18,20,25]}})查询age不是18,20,25的所有数据
- and:在查询语句中写多个条件即可
- db.xxx.find({name:"yyy", age:20}) 查询name为yyy,age为20的数据
- or:使⽤$or,值为数组, 数组中每个元素为json
- db.xxx.find({(or:[{age:{)gt:18}},{gender:'F'}]})查询age大于18或者gender为F的数据
- 查询年龄age18或gender为F, 并且姓名是gj
- db.xxx.find({(or:[{age:{)gte:18}},{gender:F}],name:'gj'})
- 判断是否在某个范围内:$nin
- 正则表达式
- 使用//或者$regex编写正则表达式
- db.xxx.find({name:/^张/})/db.xxx.find({name:{$regex:"^张"}})查询所有以张开头的数据
⽅法limit():
-
⽤于读取指定数量的⽂档
-
db.集合名称.find().limit(NUMBER)
-
查询2条学⽣信息
- db.stu.find().limit(2)
⽅法skip():
- ⽤于跳过指定数量的⽂档
- db.集合名称.find().skip(NUMBER)
- db.xxx.find().skip(2)
- 同时使用
- db.xxx.find().limit(4).skip(5)
- db.xxx.find().skip(5).limit(4)
排序sort()
- db.xxx.find().sort({age:1})按照age升序
- db.xxx.find().sort({age:-1})按照age降序
统计个数count()
- ⽅法count()⽤于统计结果集中⽂档条数
- db.col_name.find({条件}).count() 统计查询出来的结果
- db.col_name.count({条件})
- db.col_name.count({age:{$lt:20}})统计age小于20的数据数量
消除重复distinct()
- db.col_name.distinct("去重字段", {条件})
- db.xxx.distinct("age")去重age字段
- db.xxx.distinct("age", {age:{$gt:20}})对age大于20的数据去重
数据备份和恢复
在终端执行
备份的语法:
- mongodump -hdbhost:port -d dbname -o dbdirectory
- -h:服务器地址,也可以指定端⼝号
- port:端口
- -d:需要备份的数据库名称
- -o:备份的数据存放位置, 此⽬录中存放着备份出来的数据
- mongodump -h 192.168.26.133 -d test -o /home/pyvip/mongoDB
恢复语法:
- mongorestore -h dbhost:port -d dbname --dir dbdirectory
- -h: 服务器地址
- port:端口
- -d: 需要恢复的数据库实例
- --dir: 备份数据所在位置
- mongorestore -h 192.168.26.133:27017 -d test --dir /home/pyvip/mongoDB
聚合aggregate()