MongoDB 的常用命令,常见错误
安装
建议还是到官网下载对应系统的包进行安装吧,比如 Ubuntu 就下载 deb 包,CentOS 就下载 rpm 包。
启动失败
1. 删除 /tmp
文件夹下面 mongo
开头的文件(没有也不要慌)
2. 删除 /var/run/mongodb/mongodb.pid
(没有也不要慌)
3. 通过 ps -aux | grep mongo
查找已经运行的 mongo 进程,全部删除它们
4. 重启服务 systemctl restart mongod
PS: 可以查看 /var/log/mongodb/mongo.log
中内容看一下具体错误原因
5. 有一次上面的方法不行,但是我删了日志文件后...就好了...
PS: 2021/10/10 更新, 是的, 可能是因为日志文件太大了, 所以导致启动不起来, 可以设置日志文件轮询
进入数据库,查看内容
1. 无认证登录: mongo
,有认证登录: mongo -uadmin -p123
(用户名为 admin,密码为 123)
2. 查看有哪些数据库: show dbs
3. 使用某个数据库: use db_name
4. 查看里面的"表": show collections
5. 查看某个表: db.collection_name.find()
删除某个 collection
1. 进入某个数据库: use db_name
2. 删除 collection: db.collection_name.drop()
导入导出某个 collection (无验证和有验证)
1. 使用 --limit n
使命令只导入/导出 collection 的前 n 个元素
2. 使用 --port my_port
使命令指定 mongo 运行的端口
使用下面的命令从 mongo 表中导出 json 文件,也可以设置格式为 csv,这里就不写怎么弄了
mongoimport --db db_name --collection coll_name --limit 20 --file input.json
mongoimport -u root -p 12345 --authenticationDatabase admin -d db_name -c coll_name --limit 20 input.json
使用下面的命令从 json 文件导入到 mongo 表
mongoexport -d $db -c $c --limit 20 -o output.json
mongoexport --port=11017 -u root -p 123456 --authenticationDatabase=admin -d $db -c $c --limit 20 -o output.json
从某个 DB 中导出所有 collection
看下面的脚本即可,具体细节自己调整。使用方法: bash this.sh db_name out_dir
。
#!/bin/bash
if [ ! $1 ]; then
echo " Example of use: $0 database_name [dir_to_store]"
exit 1
fi
db=$1
out_dir=$2
if [ ! $out_dir ]; then
out_dir="./"
else
mkdir -p $out_dir
fi
tmp_file="fadlfhsdofheinwvw.js"
echo "print('_ ' + db.getCollectionNames())" > $tmp_file
cols=`mongo --port=11017 -uadmin -p123456 --authenticationDatabase=admin $db $tmp_file | grep '_' | awk '{print $2}' | tr ',' ' '`
for c in $cols
do
mongoexport --port=11017 -uadmin -p123456 --authenticationDatabase=admin -d $db -c $c --limit 20 -o "$out_dir/exp_${db}_${c}.json"
done
rm $tmp_file
[1] https://stackoverflow.com/questions/38017825/how-to-export-specific-number-of-records-from-mongodb
添加用户
首先切换到数据库 use admin
,然后为 admin
创建用户
db.createUser({
user: 'admin',
pwd: 'password',
roles:[{
role: 'root',
db: 'admin'
}]
})
之后登录就要使用
mongo -u admin -p password --authenticationDatabase admin
登录了。
报错总结
错误一
报错为: pymongo.errors.InvalidOperation: No operations to execute
, 这个从网上得知是因为插入了空内容, 事实确实也是这样. 但是我当时是聚集得到结果 result
后, 使用 len(list(result))
来判断后仍然出错, 这里说一下原因, 免得后人踩坑吧...
我是这样避免插入空数据的, 但是! Pymongo 中 aggregate
返回结果(即下面代码中的 result
)是一个迭代器, 而如果我使用 list(result)
那么就相当于把它遍历完毕了!!
所以如果 result
原来是有数据的, 那么我会执行最后的插入语句, 但是此时 result
已经遍历完了, 为空了!! 所以会报错!
result = db['test_1'].aggregate(...)
if not len(list(result)):
db.['test_2'].insertMany(result)
也就是说, 原来是没有数据的 result
导致我们插入失败. 而我们加了 len(list(result))
之后, 的确防范了这些空 result
进一步执行插入操作, 但原来有数据的 result
遍历完毕, 插入它们等于插入空数据, 同样导致了同样的错误.