mongodb笔记

–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);#删除几条
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值