Linux 安装 MongoDB
-
解压缩安装包,并重命名文件夹。
tar zxvf mongodb-linux-x86_64-4.0.0.tgz mv mongodb-linux-x86_64-4.0.0 mongodb
-
配置环境变量
vim /etc/profile
在 export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL 一行的上面添加如下内容: #Set Mongodb export PATH=/usr/mongodb/bin:$PATH
保存后通过下面的命令使环境变量生效:
cd ~ source /etc/profile
-
创建数据库目录
cd /usr/mongodb touch mongodb.conf mkdir db mkdir log cd log touch mongodb.log
-
修改mongodb配置文件。
vim /usr/mongodb/mongodb.conf
port=27017 #端口 尽量自定义端口 dbpath= /usr/mongodb/db #数据库存文件存放目录 logpath= /usr/mongodb/log/mongodb.log #日志文件存放路径 logappend=true #使用追加的方式写日志 fork=true #以守护进程的方式运行 maxConns=100 #最大同时连接数 #noauth = true #不启用验证 journal=true storageEngine=wiredTiger #存储引擎 bind_ip = 0.0.0.0 #这样就可外部访问 auth = true #用户认证
-
设置文件夹权限
cd /usr/mongodb chmod 777 db chmod 777 log
-
启动mongodb
mongod --config /usr/mongodb/mongodb.conf
-
添加用户,设置密码
//进入admin数据库 use admin //给admin数据库添加管理员用户名和密码,用户名和密码请自行设置 db.createUser({user:"admin",pwd:"admin123",roles:["root"]}) //验证是否成功,返回1则代表成功 db.auth("admin", "admin123") //切换到要设置的数据库,以test为例 use test //为test创建用户,用户名和密码请自行设置。 db.createUser({user: "test", pwd: "123456", roles: [{ role: "dbOwner", db: "test" }]}) 修改密码: 登陆成功后,切换至admin表 use admin db.changeUserPassword("用户名","新密码")
-
完成
MongoDB常用语句
-
启动MongoDB
win: mongod --dbpath=..\data\db linux: mongod --config mongodb.conf
-
新建用户或修改用户密码
db.addUser("java","java")
-
查看所有用户
db.system.users.find()
-
进入数据库或创建数据库
use test
-
删除数据库
db.dropDatabase()
-
创建集合
db.createCollection("mytest")
-
删除集合
db.mytest.drop()
-
单个插入文档,insert 或者 save 都可以
db.mytest.insert({"_id":1,"name":"小华","age":22,"sex":"男"}) db.mytest.save({"name":"小魏","age":22,"sex":"男"})
-
多个插入, 加中括号(数组)
db.mytest.insert([{"name":"小华","age":223,"sex":"男"},{"name":"魏","age":26,"sex":"女"}])
-
查询全部
db.mytest.find()
-
条件查询
db.mytest.find({"name":"魏","sex":"男"}) db.mytest.find({"_id":1}) // 手动输入的ID可以这样查
-
如果id是mongdb自动生成的就需要这样查询
db.mytest.find({"_id":ObjectId("61d14af84c260000ed002c7e")})
-
投影查询
db.mytest.find({"name":"魏","sex":"女"},{"name":0}) // 0是不显示name,其他都显示 db.mytest.find({"name":"魏","sex":"女"},{"name":1}) // 1是只显示name和id,其他都不显示 db.mytest.find({"name":"魏","sex":"女"},{"name":1,"_id":0}) // 只显示name,id也不显示,其他也都不显示
-
插入数据时抓错
try{ db.mytest.insert([{"_id":1,"name":"小华","age":22,"sex":"男"}, {"_id":2,"name":"小魏","age":23,"sex":"女"}, {"_id":3,"name":"小蓝","age":24,"sex":"男"}, {"_id":4,"name":"小梁","age":25,"sex":"女"} ])}catch(e){ print(e) }
-
覆盖更新,这个更新sex=nv ,但是除了id, 其他字段会变为空
db.mytest.update({"_id":1},{"sex":"nan"})
-
局部修改(常用)
db.mytest.update({"_id":1},{$set:{"sex":"nv"}})
-
批量修改, 就后面在加一个参数
{multi:true}
,比较少用。用updateMany
就不用加这个参数db.mytest.update({"name":"小欣"},{$set:{"sex":"uuuu"}},{multi:true})
-
列值增长的修改, age 字段 加1 ,如果要减1就改为-1
db.mytest.update({"_id":1},{$inc:{"age":1}})
-
删除数据
db.mytest.remove({"_id":1}) // id为1的这条数据就被删除 db.mytest.remove({"sex":"男"}) // sex为男的全部删除了 db.mytest.remove({}) // 删除全部数据,等于清空集合, 小心使用
-
统计查询, 共多少条记录
db.mytest.count()
-
查询sex为男的有多少条数据
db.mytest.count({"sex":"男"})
-
查询前2条数据
db.mytest.find().limit(2)
-
分页查询, 跳过第一页的2条数据,从第3条开始查, 拿到第3,4条数据
// limit(2) 只显示2条, skip(2) 跳过前面两条开始查询 db.mytest.find().limit(2).skip(2)
-
排序查询, 1 为升序排序,-1是倒序
// 如果排序汉字和字母,顺序是字母先,倒序是汉字先 db.mytest.find().sort({"_id":-1})
-
只显示id和name,如果{“name”:0}则除了name,其他字段全部显示
db.mytest.find({},{"name":1}).sort({"_id":-1})
-
正则查询, name 包含 魏 的都查询出来
db.mytest.find({"name":/魏/})
-
模糊查询, name 包含 魏 的都查询出来
db.mytest.find({"name":{$regex:"魏"}})
-
比较查询,gt大于,lt小于,gte大于等于,lte小于等于,ne不等于
db.mytest.find({"age":{$gt:23}}) // 大于23 db.mytest.find({"age":{$lt:23}}) // 小于23 db.mytest.find({"age":{$gte:23}}) // 大于等于23 db.mytest.find({"age":{$lte:23}}) // 小于等于23 db.mytest.find({"age":{$ne:23}}).count({"_id":1}) // 不等于23
-
不等于23的有多少条
db.mytest.find({"age":{$ne:23}}).count({"_id":1})
-
包含查询,name包含"小梁","小魏"都查出来
db.mytest.find({"name":{$in:["小梁","小魏"]}})
-
name不包含"小梁","小魏"都查出来
db.mytest.find({"name":{$nin:["小梁","小魏"]}})
-
and条件查询,age大于等于24和小于等于25
db.mytest.find({$and:[{"age":{$gte:(24)}},{"age":{$lte:(25)}}]}) 简写: db.mytest.find({$and:[{"age":{$gte:24,$lte:25}}]}) (常用)
-
or条件查询,age大于等于25或者小于等于22
db.mytest.find({$or:[{"age":{$gte:(25)}},{"age":{$lte:(22)}}]}) 简写: db.mytest.find({$or:[{"age":{$gte:24,$lte:25}}]}) (常用)
-
查询集合中的索引
db.mytest.getIndexes()
-
创建索引,创建一个age升序索引,-1是降序
db.mytest.createIndex({"age":1})
-
创建唯一索引,创建唯一索引时,这个字段不能有重复的,不然会报错
db.mytest.createIndex({"name":1},{unique:true})
-
复合索引,age升序,sex降序
db.mytest.createIndex({"age":1,"sex":-1})
-
移除索引,按条件删,或者索引名字
db.mytest.dropIndex({"age":1}) // 条件 db.mytest.dropIndex("age_1_sex_-1") // 索引名称 db.mytest.dropIndexes() // 删除所有索引,_id索引不会被干掉
-
执行计划, 返回的数据里面有
"stage":"FETCH"
是用了索引查询db.mytest.find({"name":"小魏"}).explain()
-
test
try{ db.mytest.insert([{"_id":NumberInt(1),"name":"小华","age":22,"sex":"男","create_date":new Date()}, {"_id":NumberInt(2),"name":"小魏","age":23,"sex":"女","create_date":new Date()}, {"_id":NumberInt(3),"name":"小蓝","age":24,"sex":"男","create_date":new Date()}, {"_id":NumberInt(4),"name":"小梁","age":25,"sex":"女","create_date":new Date()} ])}catch(e){ print(e) } // Date() 显示当前的时间 // new Date 构建一个格林尼治时间可以看到正好和Date()相差8小时,我们是+8时区,也就是时差相差8,所以+8小时就是系统当前时间 // ISODate() 也是格林尼治时间 // 插入当前时间,这样插入会比当前时间小8小时 db.mytest.insert({"_id":NumberInt(5),"name":"小xx","age":22,"sex":"男","create_date":new Date()})
-
时间查询 (我基本不用,都用字符串日期,个人喜好)
db.mytest.find({"create_date":{$gt:ISODate("2022-01-03 15:32")}}) // (比较少用) db.mytest.find({"create_date":{$gt:new Date("2022-01-03T15:31:20.24Z")}}) db.mytest.find({$and:[{"create_date":{$gt:ISODate("2022-01-03 15:32")}},{"create_date":{$lt:ISODate("2022-01-03 15:33")}}]}) // 简写 db.mytest.find({$and:[{"create_date":{$gt:ISODate("2022-01-03 15:32"),$lt:ISODate("2022-01-03 15:33")}}]}) db.msg_detail.find({$and:[{"create_time":{$gt:"2022-01-15 00:00:00"}},{"create_time":{$lt:"2022-01-16 00:00:00"}}{"user_id":NumberLong(27566)}]})
-
mongodb 添加字段并设置默认值
db.doc名称.update({}, {$set: {新字段名称: 默认值}}, false, true) 如:db.fly_bill.update({}, {$set: {usableStatus: "0"}}, false, true)
-
数字字符串排序
db.aaa.find().collation({"locale":"zh", "numericOrdering":true}).sort({"id":-1}).pretty() 或 db.aaa.find().collation({"locale":"zh", "numericOrdering":true}).sort({"id":-1})
-
递归查询
db.test01.find({"result.allCalls.source":"2019年报"}) 或 db.test01.find({"result.allCalls":{$elemMatch:{"source":"2019年报"}}})
-
去重
db.user_profile_search_keyword.distinct("keyword") 或 db.getCollection("user_profile_search_keyword").distinct("keyword")
$eq = (等于) $gt > (大于) $gte >= (大于等于) $lt < (小于) $lte <= (小于等于) $ne != (不等于) $in in (in) $nin !in (not in)
-
正则匹配,包含,不包含
db.xxx.find({$and:[{"name":/深圳|鹤山/},{"name":/^((?!五金|管理).)*$/},{"base":{$in:["广东","天津"]}},{"create_time":{$gte:"2022-03-10 21:20:15",$lte:"2022-03-10 21:21:15"}}]},{"name":1,"base":1,"create_time":1}) db.xxx.find({$and:[{"name":{$regex:"深圳|鹤山|广东"}},{"name":/^((?!五金|人力).)*$/}]},{"name":1}) db.tyc_company_search.find({$and:[{$or:[{$and:[{"name":/深圳|广州/},{"name":/^((?!五金|人力).)*$/}]},{$and:[{"base":/深圳|广州/},{"base":/^((?!五金|人力).)*$/}]}]},{},{}]},{"name":1,"base":1})
mongodb 数据库备份
-
一种是针对于库的mongodump和mongorestore,
-
一种是针对库中表的mongoexport和mongoimport
-
mongodump备份数据库
命令参数: mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径 示例: 导出所有数据库 mongodump -h 127.0.0.1 -o /home/mgtc/mongodb/ 导出特定数据库 mongodump -h 127.0.0.1 -d wooyun -o /home/mgtc/mongodb/
-
mongorestore还原数据库
命令参数: mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件存在路径 –drop参数:先删除所有的记录,然后恢复 还原所有数据库到mongodb中 示例: mongorestore /home/mgtc/mongodb/ #这里的路径是所有库的备份路径 mongorestore --drop /home/mgtc/mongodb/ #删除在还原所有库 还原指定的数据库 mongorestore -d wooyun /home/mgtc/mongodb/wooyun/
-
mongoexport导出表,或者表中部分字段
命令参数: mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 条件导出 --csv -o 文件名 参数: -f 导出指字段,以字号分割,-f name,email,age导出name,email,age这三个字段 -q 可以根查询条件导出,-q ‘{ “uid” : “100” }’ 导出uid为100的数据 –csv 表示导出的文件格式为csv 示例: 导出整张表 mongoexport -d wooyun -c users -o /home/mgtc/mongodb/wooyun/user.dat 导出某些字段 mongoexport -d wooyun -c users --csv -f name,uuid -o /home/mgtc/mongodb/wooyun/user.csv 根据条件导出 mongoexport -d wooyun -c users -q '{uuid:{$gt:1}}' -o /home/mgtc/mongodb/wooyun/user.json
-
mongoimport导入表,或者表中部分字段
命令参数: mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsert --drop –upsert: 插入或者更新现有数据 还原整表导出的非csv文件 mongoimport -d wooyun -c users --upsert users.dat 还原部分字段的导出文件 mongoimport -d wooyun -c users --upsertFields name,uuid users.dat 还原导出的csv文件 mongoimport -d wooyun -c users --type csv --headerline --file users.csv
-
Linux 自动备份 MongoDB
mkdir -p /home/backup/mongod_bak/mongod_bak_now mkdir -p /home/backup/mongod_bak/mongod_bak_list
vim /mongodb_bak.sh
mongodb_bak.sh 文件如下: #!/bin/sh DUMP=/usr/mongodb/bin/mongodump # mongodump备份文件执行路径 OUT_DIR=/home/backup/mongod_bak/mongod_bak_now # 临时备份目录 TAR_DIR=/home/backup/mongod_bak/mongod_bak_list # 备份存放路径 DATE=`date +%Y_%m_%d` # 获取当前系统时间 DB_USER=admin # 数据库账号 DB_PASS=password # 数据库密码 DAYS=7 # DAYS=7代表删除7天前的备份,即只保留最近7天的备份 TAR_BAK="mongod_bak_$DATE.tar.gz" # 最终保存的数据库备份文件名 cd $OUT_DIR rm -rf $OUT_DIR/* mkdir -p $OUT_DIR/$DATE # $DUMP -u $DB_USER -p $DB_PASS -o $OUT_DIR/$DATE # 备份全部数据库 $DUMP -o $OUT_DIR/$DATE # 备份全部数据库 tar -zcvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE # 压缩为.tar.gz格式 find $TAR_DIR/ -mtime +$DAYS -delete # 删除7天前的备份文件
chmod u+x mongodb_bak.sh # 给.sh文件添加x执行权限
最后把
mongodb_bak.sh
放到 Linux 定时任务里