–eval,可以进行复杂的操作
仅仅截取工作中的部分代码片段
def time_inc(self, last):
asd = '"{}"mongo --host {}:{} -u {} -p {} --authenticationDatabase admin --eval "{}"' if self.is_auth else \
'"{}"mongo --host {}:{} --eval "{}"'
if last:
time_inc = "st=db.getSiblingDB(\'local\');st.oplog.rs.find({\'ns\':{\$regex:/^%s\./}}).sort({" \
"\$natural:-1}).limit(1)[0][\'ts\']" % self.db_name
else:
time_inc = "st=db.getSiblingDB(\'local\');st.oplog.rs.find({\'ns\':{\$regex:/^%s\./}}).sort({" \
"\$natural:1}).limit(1)[0][\'ts\']" % self.db_name
time_inc = asd.format(self.mongo_path, self.host, self.port, self.username, self.password, time_inc) \
if self.is_auth else asd.format(self.mongo_path, self.host, self.port, time_inc)
log.info('time_inc_info:{}'.format(time_inc).replace('-p {}'.format(self.password), '-p xxxxxx'))
result = exec_cmd(time_inc)
reg_obj = re.compile(r"\d{10},\d+")
is_exits = reg_obj.findall(result['msg'].replace(' ', ''))
log.info('time_inc is_exits:{}'.format(is_exits))
return is_exits
启动mongo
window启动(不写到系统服务)
mongod --dbpath "C:\Program Files\MongoDB\Server\4.0\data"#window这个双引号必须加
window下写入到系统服务(之后可以去service.msc中去查看已经安装好了)
mongod --dbpath "C:\Program Files\MongoDB\Server\4.0\data\db" --logpath "C:\Program Files\MongoDB\Server\4.0\data\log\MongoDB.txt" --install --serviceName "MongoDB"
--dbpath:指定MongoDB的数据库目录
--logpath:日志目录
--install:做成windows的服务
--serviceName: 做成windows的服务的名称
Linux(默认开启了权限验证)
启动
mongod -f /usr/local/mongodb/bin/mongodb1.conf(将mongo设置为一个守护进程在后台运行)
关闭
mongod -f /usr/local/mongodb/bin/mongodb1.conf --shutdown
常用命令
show dbs #显示所有已经存在的数据库
use mongo_db #创建数据库
db.mongo_db.insert({"name":"菜鸟教程"}) #插入数据,自动创建一个名为mongo_db的集合,并插入数据
db.dropDatabase() #删库
db.createCollection("runoob") # 创建集合,类似数据库中的表
db.runoob.drop() #删除表runoob
db.runoob.remove({xx:xx})#根据条件xx:xx删除记录
show collections 和 show tables显示结果一样的
db.集合名.find() # 查询所有数据,自动显示最多20个,it 下一页
db.集合名.findOne() 或者 db.集合名.find({}).limit(1) # 查询第一个
db.system.users.find()#查询所有用户,切到admin库下才能查看
db.orderdetial.find().count()#获取某集合下总的记录数
db.orderdetial.find().sort({_id:-1}).limit(1);#获取最后一条记录
db.orderdetial.find().sort({$natural:-1}).limit(1);#获取最后一条记录
db.help()#当前数据库所支持的方法
db.orderdetial.help()#查询集合支持哪些方法
rs.reconfig()#更新副本集的信息
不进入shell获取所有数据库
echo 'show dbs' |mongo -u root -p rootpwd --authenticationDatabase admin #linux带验证显示all数据库
mongo -uadmin -p123 --authenticationDatabase admin --eval "db.adminCommand('listDatabases')"#window、Linux都可以用这个
mongo admin --eval "db.adminCommand('listDatabases')"#没有开启权限验证时用这个
权限控制
删除全部管理员(在它下面创建的普通用户也随之删除)用户后需要先auth=false,再去创建一个管理员用户,然后再去开启auth=true
db.createUser({user:"administrator",pwd:"123456",roles:[{role:"root",db:"admin"}]})#Linux下可以用这个
但是这个时候就只能这样去连接了
mongo --port 27017 --authenticationDatabase admin#先
use admin#然
db.auth('administrator','123456')#最后
启动mongodb服务
mongo -uadministrator -p123456 --authenticationDatabase admin#这样连接连不上了
可以用下面这句命令挽救
挽救措施
mongo --port 27017 --authenticationDatabase admin#先
use admin#然
db.auth('administrator','123456')#最后
到此我们可以删掉这个不正常的管理员用户,之后退出停止服务,将auth置为false后启动服务,再去重新创建
#创建
db.createUser({user:"administrator",pwd:"123456",roles:[{role:"root",db:"admin"}]})
#建好后,先不要去db.auth('administrator','123456'),直接退出
启动mongodb服务
mongo -uadministrator -p123456 --authenticationDatabase admin#此时可以正常连接了
创建普通用户
db.createUser({user:"osyunweidbuser",pwd:"123456",roles:[{role:"readWrite",db:"osyunweidb"}]}) #账号:osyunweidbuser 密码:123456 权限:只有该数据库osyunweidb的读写权限
说明:如果不是在验证了管理员权限下,去查看osyunweidb信息时,如果osyunweidb指定了用户名和密码,则此时需要单独验证
mongo --port 27017 --authenticationDatabase admin
插入测试数据
use test_db;
for(var i = 0; i < 10000; i++){ db.order0531.insert({a: i});};
for(i=0;i<150000;i++){ db.orderdetial.insert({"id":i,"name":"shenzheng","addr":"南山","date":new Date()}); };
增删该查
并插入这些数据
db.student.insert({"name":"李四","age":"22","sex":"女","phone":"18513081650","class":"计算机1班"});#里面的key-value不用保持一致
db.student.insert([{"name":"王五","age":"22","sex":"男","class":"计算机2班"},{"name":"赵六","age":"22","sex":"女","phone":"18513081650","class":"计算机1班"}]);#同时插入多条数据
更新:
db.student.update({"name":"张三"},{"name":"张三丰"});#如果有多条语句,只修改第一条,会覆盖原有数据
db.student.update({"22":"女"},{"name":"张三丰"});
db.student.update({"name":"张三"},{$set:{"name":"张无忌"}});#只想改某个key的value使用set
db.student.update({"name":"王五"},{$set:{"name":"张无忌"}},{multi:true});#把所有的记录都改了
查询:
db.student.find();#查询全部
db.student.find({"name":"李四"});#查询指定记录,返回这一行结果
db.student.update({"name":"张三丰"},{"name":"张无忌","age":"28","sex":"男"});
db.student.find({"name":"张无忌","age":"28"});#and操作
db.student.find({$or:[{"name":"张无忌"},{"name":"李四"}]});#or操作
db.student.find().pretty();#格式化显示
db.student.find().count();#获取结果的行数
db.student.find().sort({"age":-1});#按照sort里面key的值排序,1为正序,-1为倒序
删除:
db.student.remove();#删除所有数据
db.student.remove({"22":"女"});#按照条件删除
db.student.remove({"name":"张无忌"},2);#删除几条