Skip to content

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 遍历完毕, 插入它们等于插入空数据, 同样导致了同样的错误.

Comments