mongodb基本操作

介绍

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文件
    1. 使用mongoexport将数据库数据导出到本地
    2. 直接处理json文件
    3. 将生成好的json文件mongoimport到数据库

Mongo关闭异常问题处理

  1. mongo数据存储位置
    可以查看mongodb.conf配置文件查看
  2. 安全停止mongo进程方法
    (1) 登录mongo, 使用shutdownServer()停止mongo进程
    (2) kill 或 kill -2 PID
    安全停止在发出停止命令后,数据库在后台会进行一系列的操作来保证数据库最终是一致性关闭
  3. 不安全停止mongo处理
    kill -9 PID 表示向mongod进程发送sigkill信号,MongoDB直接停止,不会做一些相关处理,
    如数据库直接关闭,数据丢失,数据文件损坏,但是修复数据库(成本高,有风险)
  4. 针对不安全停止mongo处理方法:
    (1) 不安全停止monog之后,mongo会被锁住,mongo数据文件夹会生成 mongod.lock文;删除mongod.lock
    (2) 用修复方式 mongod –repair –dbpath –repairpath –storageEngine=wiredTiger

帮助文档

其实了解一个东西最好的办法是使用帮助文档

  • help 全部的帮助文档
  • db.help() : 数据库的帮助方法
  • db.mycoll.help() : 数据表的帮助方法
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值