介绍
linux系统下命令行操作mongodb,整理一些基本操作和mongo不正常关闭之后的修复。在linux系统操作mongodb的前提是系统安装了mongo命令,或者下载对应的安装包,使用其中的操作命令。
登录
# url类型登录 mongo host:port/db_name
# 登录到127.0.0.1 端口27017的test数据库
mongo 127.0.0.1:27017/test
# 参数类型登录 mongo --host <HOST> --port <PORT> -u <USER> -p <PASSWORD>
# 登录到127.0.0.1 端口27017,并指定用户为visitor
mongo --host 127.0.0.1 --port 27017 -u visitor -p test
# 登录到mongo之后简易操作
# 使用名字为test的数据库, use <db_name>
use test
# 查看数据库下全部的数据表
show collections
更多细节通过 mongo –help 查看
命令行基本操作
mongodump
- 导出整个mongo数据库 ; 可选择包含索引,更多细节mongodump –help
# 导出整个数据库
# -h host
# --port 端口
# -u 用户名
# -p 密码
# -d 数据库名称
# -o 导出的数据存放位置
# --authenticationDatabase 用户属于的db
# 示例:
mongodump -h <host> --port <port> --authenticationDatabase <admin> -u <user> -p <password> -d <db_name> -o <export_dir>
- 导出mongo数据表,包含原有数据表的索引
# 导出数据库中的某个数据表
# -h host
# --port 端口
# --authenticationDatabase 用户属于的db
# -u 用户名
# -p 密码
# -d 数据库名称
# -c 数据表名称
# -o 导出的数据存放位置
# 示例
mongodump -h <host> --port <port> --authenticationDatabase <admin> -u <user> -p <password> -d <db_name> -c <colleciton_name> -o <export_dir>
mongorestore
- 导入整个mongo数据库,如果希望覆盖原有数据,选择参数 –drop (谨慎使用),更多细节mongorestore –help
# 导入整个数据库
# -h host
# --port 端口
# --authenticationDatabase 用户属于的db
# -u 用户名
# -p 密码
# -d 数据库名称
# --drop 导入数据前先删除原有数据
# --dir 准备导入的数据目录
# 示例
mongorestore -h <host> --port <port> --authenticationDatabase <admin> -u <user> -p <password> -d <db_name> --drop --dir <restore_dir/db_name>
- 导入mongo数据表,如果希望覆盖原有数据,选择参数 –drop (谨慎使用)
# 导入数据库中的某个数据表
# -h host
# --port 端口
# --authenticationDatabase 用户属于的db
# -u 用户名
# -p 密码
# -d 数据库名称
# --drop 导入数据前先删除原有数据
# --dir 准备导入的数据目录
# -c 数据表名称,后面直接跟准备导入数据表的文件名
# 示例
mongorestore -h <host> --port <port> --authenticationDatabase <admin> -u <user> -p <password> -d <db_name> --drop -c <collection_name> <restore_dir/db_name/collection_bson_name>
mongoexport
- 导出某个mongo数据表,数据表的原有索引不保留;数据文件一条记录一行,格式为json。更多细节mongoexport –help
# 整个数据表导出
# -h host
# --port 端口
# --authenticationDatabase 用户属于的db
# -u 用户名
# -p 密码
# -d 数据库名称
# -c 数据表名称
# -o 导出的数据存放位置,如果指定文件夹则默认文件名
# 示例
mongoexport -h <host> --port <port> --authenticationDatabase <admin> -u <user> -p <password> -d <db_name> -c <collection_name> -o <export_dir>
# 数据表导出时,添加过滤条件和限制个数
# --query 查询过滤条件,json格式, eg. {"name": "visitor"}
# --limt 导出记录的个数, eg. 5
mongoexport -h <host> --port <port> --authenticationDatabase <admin> -u <user> -p <password> -d <db_name> -c <collection_name> -o <export_dir> --query=<json> --limt=<count>
mongoimport
- 导入某个mongo数据表,覆盖原始数据则选择参数 –drop。更多细节 mongoimport –help
# 整个数据表导入,并覆盖原有数据
# -h host
# --port 端口
# --authenticationDatabase 用户属于的db
# -u 用户名
# -p 密码
# -d 数据库名称
# -c 数据表名称
# --drop 导入数据前先删除原有数据
# --file 准备导入数据表的数据文件
# 示例
mongoimport -h <host> --port <port> --authenticationDatabase <admin> -u <user> -p <password> -d <db_name> -c <collection_name> --drop --file <file_name>
- 导入模式选择
# 高版本mongodb提供导入模式
--mode=[insert|upsert|merge]
默认insert,直接导入
upsert: 导入或更新已有的记录,以"_id"字段的值判断记录是否为同一条
merge: 导入或修改已有的记录,记录合并,以"_id"字段的值判断记录是否为同一条
登录之后基本操作
登录到mongo之后,选择需要操作的数据库,对对应的数据表进行操作
# 切换目标数据库
use <db_name>
# 查看数据库帮助
db.help()
# 查看数据表班长
db.<collections_name>.help()
查询操作
查询操作主要包括find, findOne等命令
- 具体某个表按照条件查询数据
# 操作: db.<collection_name>.find({<query>})
# 示例意义:查询topic_unit表中:is_valid为false,is_leaf为true, source为ceshi的记录
db.topic_unit.find({"is_valid":false, "is_leaf":true, "source":"ceshi"})
# 示例意义:查询topic_unit表中:is_valid为false,is_leaf为true, source不等于ceshi的记录
db.topic_unit.find({"is_valid":false, "is_leaf":true, "source":{$ne:"ceshi"})
- 根据时间比较
# 示例意义:查询topic_unit表中:insert_time大于等于2017-06-01 14:18:36:407的记录
# $gte: 大于等于
db.topic_unit.find({"insert_time": {$gte: new Date("2017-06-01T14:18:36.407Z")}})
记录更新
更新记录,可以选择update, updateMany等命令
# 更新记录
# 示例意义:topic_unit表中id=xxx的记录,status更新为0
db.topic_unit.update({_id:ObjectId("xxxx")}, {$set:{status:0}})
# 更新多条记录
# 示例意义:topic_unit表中status=5的记录,更新为status=0
db.topic_unit.updateMany({"status":5}, {$set:{status:0}})
数组类型精准匹配
简单的字符串和数字类型匹配比较简单,针对数组类型的数据,mongo可以精准匹配和模糊匹配
- mongodb 数组类型精准匹配
# 示例意义:查询topic_unit表中"property"值为["34", "83"]的记录
# 结果:
# 记录中"property"=["34", "83"]才会匹配,
# 像"property": ["34", "83", "23"] 则不会匹配
db.topic_unit.find({
"property": ["34", "83"]
})
- mongodb 数组类型一个元素匹配
# 示例意义:查询topic_unit表中"property"值为["34"]的记录
# 结果:
# 记录中"property"=包含"34"的均匹配,
# 像"property"=["34", "83"], "property"=["34"]
db.topic_unit.find({
"property": "34"
})
内嵌文档精准匹配
内嵌文档类型简单可以简单理解为字典类型的数据, 它可以包括数值,字符串,数组等类型的数据,如
"property": {
"age":"34",
"colur":"yellow"
}
- mongodb 内嵌文档精准匹配
# 示例意义:查询topic_unit表中"property"值为{"age":"34", "colur":"yellow"}的记录
# 结果:
# 记录中"property"={"age":"34", "colur":"yellow"}匹配,
# 像"property"={"age":"34", "colur":"yellow", "name":"ok"} 不匹配
db.topic_unit.find({
"property": {
"age":"34",
"colur":"yellow"
}
})
- mongodb 内嵌文档字段相等匹配
# 示例意义:查询topic_unit表中"property"的age为34的记录
# 结果:
# 记录中"property"={"age":"34", "colur":"yellow"}匹配,
# 像"property"={"age":"34", "colur":"yellow", "name":"ok"} 匹配
db.collection_name.find({"property.age":"34"})
大量数据进行数据库读写
对于数据量比较大的情况,如清洗整个数据表的数据,该表有千万条记录,平时操作发现较好的办法并不是写代码直接操作数据库。
- mongodb 支持JavaScript 脚本处理数据
- 先将数据表利用mongoexport或mongodump导出,直接处理json文件
- 使用mongoexport将数据库数据导出到本地
- 直接处理json文件
- 将生成好的json文件mongoimport到数据库
Mongo关闭异常问题处理
- mongo数据存储位置
可以查看mongodb.conf配置文件查看 - 安全停止mongo进程方法
(1) 登录mongo, 使用shutdownServer()停止mongo进程
(2) kill 或 kill -2 PID
安全停止在发出停止命令后,数据库在后台会进行一系列的操作来保证数据库最终是一致性关闭 - 不安全停止mongo处理
kill -9 PID 表示向mongod进程发送sigkill信号,MongoDB直接停止,不会做一些相关处理,
如数据库直接关闭,数据丢失,数据文件损坏,但是修复数据库(成本高,有风险) - 针对不安全停止mongo处理方法:
(1) 不安全停止monog之后,mongo会被锁住,mongo数据文件夹会生成 mongod.lock文;删除mongod.lock
(2) 用修复方式 mongod –repair –dbpath –repairpath –storageEngine=wiredTiger
帮助文档
其实了解一个东西最好的办法是使用帮助文档
- help 全部的帮助文档
- db.help() : 数据库的帮助方法
- db.mycoll.help() : 数据表的帮助方法