MongoDB是一个基于分布式 文件存储的NoSQL数据库,适合存储JSON风格文件的形式。
{‘name‘:‘guojing‘,‘gender‘:‘男‘}
{‘name‘:‘guojing‘,‘gender‘:‘男‘} {‘name‘:‘huangrong‘,‘age‘:18} {‘book‘:‘shuihuzhuan‘,‘heros‘:‘108‘}
sudo apt-get install mongodb
配置文件为 /etc/mongodb.conf,默认端口号:27017
sudo service mongodb start #相当于执行命令 sudo mongod --config /etc/mongod.conf
sudo service mongodb stop
sudo service mongodb restart #修改了配置文件/etc/mongodb.conf后,需要重启mongodb服务器让配置生效
sudo mongo
db
show dbs
use 数据库名
切换数据库,如果数据库不存在,当插入数据或创建集合时,会自动创建这个数据库
db.dropDatabase()
删除当前指向的数据库,如果不存在,则什么也不做
db.createCollection(name[,options]) #name集合名称 #options可选,是一个用于指定集合配置的文档,其中capped参数默认不设置上限(false),若设置上限(true)则需要指定参数size,单位字节
#不设置集合大小 db.createCollection("stu") #设置集合大小 db.createCollection("sub", { capped : true, size : 10 } )
show collections
db.集合名.drop()
db.集合名.insert(文档) 或 db.集合名.insert([文档...])
#如果不指定_id字段,则分配一个唯一的ObjectId;如果指定_id字段,且_id已经存在时,不做任何操作;如果一次性插入多条数据,以数组的方式传入文档
# 不指定_id db.stu.insert({name:‘gj‘,gender:1}) #指定_id s1={_id:‘20160101‘,name:‘hr‘} s1.gender=0 db.stu.insert(s1)
db.集合名.remove(条件,{justone:<boolean>}) #参数justOne默认false,删除多条
# 只删除匹配到的一条数据 db.stu.remove({gender:0},{justOne:true}) #删除所有 db.stu.remove({})
db.集合名.update({条件},$操作符,{multi: <boolean>}]) #参数multi只和$操作符一起使用,默认false,只修改一条数据,true表示修改多条数据
# 不使用操作符$set,修改整条文档 db.stu.update({name:‘hr‘},{name:‘mnc‘}) #使用操作符$set指定属性修改 db.stu.update({name:‘hr‘},{$set:{name:‘hys‘}}) #multi参数和$set一起使用,修改多条文档 db.stu.update({},{$set:{gender:0}},{multi:true})
db.集合名.save(document)
#在手动插入_id字段时,如果_id已经存在,做全文档更新操作,其余均表示插入数据。
db.stu.save({_id:‘20160102‘,‘name‘:‘yk‘,gender:1}) db.stu.save({_id:‘20160102‘,‘name‘:‘wyk‘}) #对上述文档做修改
db.集合名.find({条件文档}) #查询所有 db.集合名.findOne({条件文档}) #只查询第一条 db.集合名.find({条件文档}).pretty() #结果格式化输出
#查询年龄大于等于18的学生 db.stu.find({"age":{$gte:18}})
# 查询年龄大于或等于18,并且性别为1的学生 db.stu.find({"age":{$gte:18},"gender":1}) #查询年龄大于18,或性别为0的学生 db.stu.find({$or:[{"age":{$gt:18}},{"gender":1}]}) #查询年龄小于18或者大于20,性别为1的学生 db.stu.find({$or:[{"age":{$lt:18}},{"age":{$gt:20}}],"gender":1})
#查询年龄18、20以及22岁的学生 db.stu.find({"age":{$in:[18,20,22]}}) #查询年龄不等于18或20的学生 db.stu.find({"age":{$nin:[18,20]}})
#查询姓黄的学生 db.stu.find({"name":/^黄/}) db.stu.find({"name":{$regex:"^黄"}})
#查询年龄18-22的学生 db.stu.find({$where:function(){return this.age>18 && this.age<22}}) #查询年龄小于18或者大于22的学生 db.stu.find({$where:function(){return this.age<18 || this.age>22}})
db.集合名.find({条件},{字段名:1,...}) #1表示该字段显示,0不显示;_id列默认显示,不显示需要明确设置为0
#查询姓名和年龄(显示_id) db.stu.find({},{name:1,gender:1}) #查询姓名和年龄(不显示_id) db.stu.find({},{_id:0,name:1,gender:1})
db.集合名.find({条件}).skip(number) #number默认为0
#查询从第3条开始的学生信息 db.stu.find().skip(2)
db.集合名.find({条件}).limit(number) #不写number参数,默认读取所有文档
#读取3条学生信息 db.stu.find().limit(3)
#查询第5-9条学生信息 db.stu.find().skip(4).limit(5) #相当于跳过4条数据,选5条
db.集合名称.find({条件}).sort({字段:1,...}) #1表示升序,-1表示降序
#根据性别降序,再根据年龄升序 db.stu.find().sort({"gender":-1,"age":1})
db.集合名.find({条件}).count()
或者
db.集合名.count({条件})
#统计年龄大于20的男生人数 db.stu.count({"age":{$gt:20},"gender":1})
db.集合名.distinct("字段名",{条件})
db.集合名.aggregate([{管道:{表达式}}...])
# 统计男、女生人数 db.stu.aggregate([{$group:{"_id":‘gender‘,"couter":{$sum:1}}}]) #结果文档中显示_id和counter的值
# 求学生总人数和平均年龄 db.stu.aggregate([{$group:{_id:null,counter:{$sum:1},average_age:{$avg:"$age"}}}])
#统计男、女生信息 db.stu.aggregate([{$group:{_id:"$gender",objects:{$push:"$$ROOT"}}}])
#查询年龄大于20的学生 db.stu.aggregate([{$match:{age:{$gt:20}}}]) #查询年龄大于20的男、女生人数 db.stu.aggregate([{$match:{age:{$gt:20}}},{$group:{_id:"$gender",counter:{$sum:1}}}])
#查找学生姓名、年龄 db.stu.aggregate([{$project:{"_id":0,"name":1,"age":1}}]) #查询男生、女生人数,但仅输出人数 db.stu.aggregate([{$group:{_id:‘$gender‘,counter:{$sum:1}}},{$project:{_id:0,counter:1}}])
#查询学生信息,按年龄升序 db.stu.aggregate([{$sort:{age:1}}]) #查询男生、女生人数,按人数降序 db.stu.aggregate([{$group:{_id:‘$gender‘,counter:{$sum:1}},{$sort:{counter:-1}}])
#查询2条学生信息 db.stu.aggregate([{$limit:2}])
#查询从第3条开始的学生信息 db.stu.aggregate([{$skip:2}]) #统计男生、女生人数,按人数升序,取第二条数据 db.stu.aggregate([{$group:{_id:"$gender",counter:{$sum:1}}},{$sort:{"counter":1}},{$skip:1},{$limit:1}])
db.集合名称.aggregate([{$unwind:‘$字段名称‘}])
for(var i=0;i<1000000;i++){db.stu.insert({name:‘test‘+i,num:i})}
查询语句.explain("executionStats")
‘millis‘后面显示的是查询时间,单位ms
db.集合.ensureIndex({属性:1或-1}) #1表示升序,-1表示降序,建立后的索引名称为"属性_1"或者"属性_-1"
例如:db.stu.ensureIndex({name:1}),建立后的索引名称为"name_1"
db.集合.ensureIndex({属性:1},{"unique":true})
db.集合名.ensureIndex({属性1:1,属性2:1...})
db.集合名.getIndexes()
db.集合名.dropIndex("索引名称")
为了更安全的访问mongodb,需要访问者提供用户名和密码,于是需要在mongodb中创建用户。mongodb数据库采用了角色-用户-数据库的安全管理方式。
use admin #首先切换到admin数据库 db.createUser({ user:‘用户名‘, pwd:‘密码‘, roles:[{role:‘root‘,db:‘admin‘}] })
#noauth = true auth = true #开启安全验证
sudo service mongodb restart
# sudo mongo -u ‘用户名‘ -p ‘密码‘ --authenticationDatabase ‘数据库名‘ sudo mongo -u ‘admin‘ -p ‘密码‘ --authenticationDatabase ‘admin‘
db.createUser({ user:‘用户名‘, pwd:‘密码‘, roles:[{role:‘readWrite‘,db:‘数据库名‘}...] #数组里可以有多个角色文档,比如用户在不同的数据库里都有读写权限 })
show users
db.updateUser(‘用户名‘,{pwd:‘新密码‘,roles:[{‘新角色‘}...]})
use admin #切换到admin数据库 db.system.users.remove(条件)
sudo mongo -u ‘用户名‘ -p ‘密码‘ --authenticationDatabase ‘数据库名‘
复制提供了数据的冗余备份,并在多个服务器上存储数据的副本,允许从硬件故障和服务中断中恢复数据,能够实现无宕机维护(自动故障转移与自动恢复)。
复制至少需要2个节点,其中1个为主节点,其它均为从节点。任何节点均可以成为主节点。
主节点负责所有写入操作,从节点定期轮询主节点获取这些操作并执行这些操作,从而保证从节点的数据与主节点一致。
mkdir ~/Desktop/t1
mkdir ~/Desktop/t2
sudo mongod --bind_ip 192.168.196.128 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0
sudo mongod --bind_ip 192.168.196.128 --port 27018 --dbpath ~/Desktop/t2 --replSet rs0
sudo mongo --host 192.168.196.128 --port 27017
rs.initiate()
哪个服务器执行初始化,哪个服务器就作为主节点,rs是mongo服务器中专门用于复本集操作的内置对象
rs.status()
rs.add("192.168.127.128:8899")
sudo mongo --host 192.168.196.128 --port 27018
rs.slaveOk()
主服务器插入数据,从服务器就可以读取数据了
rs.remove(‘192.168.196.128:27018‘) #需要在主服务器操作
关闭主服务器后再重新启动,会发现原来的从服务器变为了主服务器,新启动的服务器(原来的主服务器)变为了从服务器,但是注意重新设置rs.slaveOk()
sudo mongodump -h 服务器地址 -d 需要备份的数据库 -o 备份数据存放目录
mkdir ~/Desktop/test1_bak #创建存放备份数据的目录 sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1_bak
sudo mongorestore -h 服务器地址 -d 恢复后数据库名 --dir 备份数据所在位置
sudo mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1_bak/test1
sudo pip3 install pymongo
import pymongo
有安全认证:client=MongoClient("mongodb://用户名:密码@host:27017/数据库名称") 无安全认证:client=MongoClient("mongodb://localhost: 27017")
db = client.数据库名
例如:db = client.test
stu = db.stu
stu1 = stu.find_one({条件}) #返回一条文档,字典类型
cursor = stu.find({条件}) #返回迭代器对象cursor #方式1:用for循环迭代取值 for s in cursor: print(s) #字典类型 #方式2:用next取值 s1 = next(cursor) s2 = next(cursor) ...
stu.insert_one(文档)
stu.insert_many([文档1,文档2...])
stu.update({条件},文档) #注意条件中的数字一定要写成字符串类型
stu.update_one({条件},{$set:{文档}})
stu.update_many({条件},{$set:{文档}})
stu.delete_one({条件})
stu.delete_many({条件})
原文:https://www.cnblogs.com/Elite-Wang/p/14587595.html