一、 MongoDB数据库使用注意事项:
1. MongoDB数据库的命令:如果是单个单词组成,则默认小写;如果有多个单词组成,则第一个单词首字母小写,后面的单词首字母大写。 如:db.dropDatabase() 小驼峰命名法
2. MongoDB数据库的命令参数:基本都是以 字典键值对形式传递。
3. 一个MongoDB里可以有多个 数据库(db),一个数据库里可以有多个 集合(collection),一个集合里可以有多个 文档(document),每个文档数据都是由 字典键值对 形式保存。
4. MongoDB里的数据库不需要单独创建,通过 use 切换即可使用。如果数据库里没有数据,数据库不会创建;当数据库里有数据时,数据库才会被创建。
5. MongoDB不需要事先创建 数据库、集合、字段,只要向 集合 中插入一条 文档数据,则集合和数据库默认创建。
二、mongoDB可以分两种方式启动
1.sudo mongod(普通模式开启服务器)
2.sudo mongod --auth (认证模式开启服务器)
在认证模式下:
1.如果是第一次进入,是默认用户是root用户admin,必须要创建一个新的root用户才可以执行
use admin
# 创建用户名,密码,并制定权限
db.createUser({"user" : "username", "pwd" : "password", roles : ["root"]})
2.如果用户已经存在,必须先切换用户,才能执行
权限有[root, readWrite,read]
user admin
# 登录之前创建的用户
db.auth("username","password")
# 可以继续创建新用户,并制定不同权限
db.createUser({"user" : "hello", "hellopwd" : "123456", "roles" : ["db" : "test", "role" : "readWrite]})
db.createUser({"user" : "world", "worldpwd" : "123456", "roles" : ["db" : "test", "role" : "read]})
show users 可以查看已有的账户,创建好新用户时,可以通过db.auth("username","pwd")切换用户
删除用户:
db.dropUser("username")
在与Python的交互中
1.保证是sudo mongod --auth 验证模式开启的mongod服务
2.连接到mongoDB数据库后,先切换到admin数据库
admin = client.admin
admin.authenticate("username","password")
然后就可以进行正常的增删改查操作了
三、MongoDB数据库,集合的基本操作
1.查看当前所在的数据库 db
2.查看mongoDB中所有的数据库 show dbs
3.切换到指定的数据库 use hello(没有自动创建)
4.查看当前数据库下的所有集合 show collections
5.查看指定集合hello的所有数据 db.hello.find()
6.删除当前所在数据库 db.dropDatabase()
四、MongoDB集合的基本使用
1.在当前数据库下创建集合 db.createCollection('hello') 直接使用系统也会创建
2.查看当前数据库下所有集合 show collections
3.删除当前数据库下的指定集合hello db.hello.drop()
五、MongoDB文档的增删改查
1.增加数据
1> 每次写入,添加文档数据
db.hello.insert({_id : 1, name : "haha" , age : 18})
2> 创建data空文档,再添加文档数据
data = {}
data._id = 2
data.name = "xixi"
data.age = 20
db.hello.insert(data)
2.删除数据
remove({_id : 1, {justOne : true}})
第一个参数:表示查询条件,默认情况下所有符合条件的文档数据全部删除
第二个参数:默认justOne为flase,表示全部删除,手动修改为true表示只删除第一条符合匹配的文档
3.修改数据
1>将制定文档数据,全部替换修改
db.hello.update({name : "haha"}, {age : "20"})
结果{_id : 1, name : "haha" , age : 18} -- > {age :"20" }
2>如果只想修改指定的字段,需要用$set来指定
db.hello.update({name : "xixi"} , {$set {age : 30}})
这样就能保证值修改age字段,其他字段的值保持不变了
3>save() --》(insert + update)
save()方法是基本_id来匹配的
如果_id不存在,则相当于 insert()
如果_id存在,则相当于update()
4.查询数据
find() 查找所有符合匹配的文档结果
findOne() 查找第一个符合匹配的文档结果
find().pretty() 查找所有符合匹配的文档结果,并格式化显示
1>数值判断运算符
db.hello.find({age : 18}) 默认是等于
gt : 大于 lt: 小于 gte : 大于等于 lte : 小于等于
例:db.hello.find({age : {$gt : 18}})
2>逻辑判断运算符
$and
可以用:db.hello.find({"age" : 18,"name" : "haha"}
也可以用:db.hello.find($and : [{"age" : 18} , {"name" : "haha"}])
$or
db.hello.find($or : [{"age" : 18 }, {"name" : "haha"} ])
3>范围运算符: $in $nin(除列表外的所有数据)
db.hello.find("name" : {$in : ["haha", "xixi"]})
db.hello.find("name" : {$nin : ["haha", "xixi"]})
4.支持正则表达式
1>// 包含,但是功能简单
db.hello.find({"name" : /^黄/}) # 查找所有 name值 以 "黄"开头的文档数据
2>$regex 修饰,支持复杂功能.(可以在options里添加参数)
db.stu.find({"name" : {$regex : "^B", $options : "$i"}}) # 表示查找所有name 以 b开头(忽略大小写)
5. $where 使用自定义函数执行查询
# where 会迭代集合中的每一条文档,并用 this表示,可以判断文档指定字段内容,返回符合判断结果的文档,最后统一输出。
db.hello.find({$where : function() {return this.age >= 18} })
六.对find()结果做处理
1. skip() 和 limit()
skip() 表示跳过指定 多行
limit() 表示显示指定 多行
# 对查询结果先跳过2行,再显示3行
> db.stu.find().skip(2).limit(3)
注意:skip() 和 limit() 方法使用顺序不影响结果
2. 投影 (当find() 使用第二个参数,则启用投影)
只显示查询结果的指定字段
# 只显示 name 和 _id(默认就显示),其他则不显示
db.stu.find({}, {name : 1})
# 不显示 name,其他默认都显示
db.stu.find({}, {name : 0})
_id 默认一定会显示,除非手动指定为 0 不显示
db.stu.find({}, {name : 1, _id : 0})
注意:投影显示时, 0 和 1 不能混用,但是 _id 比较特殊,可以单独指定为 0
可以用 用 true 或者 false 表示 1 或者 0
3. sort() 排序处理 (一般都是按数字排序)
# age : 1对年龄按升序排序
db.stu.find().sort({age : 1})
# age : -1 表示对年龄按降序排序
db.stu.find().sort({age : -1})
# gender : 1 表示对性别按升序排序,gender的值是字符串,则按字符串首字母的ascii值进行排序(少用)
db.stu.find().sort({gender : 1})
# 同时使用多个排序条件:先按第一个排序条件进行排序,如果排序后有相同的字段内容,再按第二个排序条件排序处理。
db.stu.find().sort({age : -1, gender : 1})
4. count() 统计查询结果的文档个数
# 二者相等,结果相同
db.stu.find().count()
db.stu.count()
# 二者相等,结果相同
db.stu.find({age : 18}).count()
db.stu.count({age : 18})
5. distinct() 对指定字段去重显示
# 查看所有 hometown 值的 去重结果,返回一个array
db.stu.distinct("hometown")
# 查看所有age大于等于18的 hometown去重结果
db.stu.distinct("hometown", {age : {$gte : 18}})
七、 aggregate 聚合运算
支持多个管道处理
# 可以同时支持多个管道处理,前一个管道的输出将做为下一个管道的输入
db.stu.aggregate([ {管道1}, {管道2}, {管道3}])
1. $group 分组管道
将集合中所有的文档,按指定字段值 进行分组,再对每一组使用统计方法
db.stu.aggregate([ {$group : {_id : "$分组依据字段", 统计结果字段名: {统计方法 : "$统计的字段"}}} ])
2. $match 对所有文档按指定条件进行过滤处理
(如果只做过滤操作不涉及分组,使用 find() 即可)
一般配合$group使用,先对所有文档进行过滤,再应用分组计算(默认分组是对所有文档进行处理)
3. $project 投影处理(和find的投影类似)
4. $sort() 排序处理(和 sort()方法使用类似)
5. $limit限定显示 和 $skip跳过显示
(和find()的 limit() 和 skip() 使用方式一致,但是对顺序有明确要求)
6. (了解)$unwind 对数组数据类型的 字段进行拆分,返回拆分后的多条文档
八、MongoDB的索引操作:
# 创建10万条数据的集合
for(i=0;i<100000;i++) {db.test.insert({name:'test'+i,age:i})}
# 查看查询状态
> db.test.find({age : 1314}).explain("executionStats")
"executionTimeMillis" : 207 表示查询执行的消耗时间,单位是 毫秒
在MongoDB中,_id 是默认的索引,且不可删除。
> db.test.find({_id : 1314}).explain("executionStats")
"executionTimeMillis" : 3 表示查询执行的消耗时间,单位是 毫秒
1. 创建索引 :创建新索引 age
db.test.ensureIndex({age : 1})
2. 查看当前集合中所有的索引
> db.test.getIndexes()
3. 删除索引 : 根据索引名 删除索引
db.test.dropIndex("age_1")
九、MongoDB数据的备份和恢复
1. 备份
mongodump -h 需要备份的主机IP -d 需要备份的数据库 -o 备份的数据库文件保存的位置
$mongodump -h 192.168.66.64:27017 -d youyuan -o ./mongodata/
2. 恢复
mongorestore -h 需要恢复的主机IP -d 需要恢复的数据库名 --dir 恢复文件的目录位置(指定的到数据库的目录名)
$mongorestore -h 192.168.66.64:27017 -d youyuan --dir ./mongodata/youyuan/
十、在Python中通过账户登录mongodb 操作数据库
import pymongo
# 创建数据库连接
client = pymongo.MongoClient('127.0.0.1', 27017)
# 创建数据库对象
db = client.stu
# 然后用db.集合名就可以进行增删改查操作了,和终端中命令一样