MongoDB基本操作

数据库实例建立后,就可以对数据库进行各种基本命令操作了,具体包括了插入、更新、删除、查询、索引、聚合、复制、分片等。

可以参考:https://docs.mongodb.com/manual/crud/

插入文档

通过MongoDB往MongoDB指定集合里插入文档,在传统关系型数据库里相当于往表里插入记录,最主要的区别是MongoDB事先无需对数据存储结构进行定义,用插入命令往数据库文件里写入数据的同时就自动建立相关内容。

语法:db.collection.insert({“键名1”:值1, “键名2”: 值2 …})

  1. > use test
  2. switched to db test
  3. > db.books.insert(
  4. ... {name:"C语言编程",
  5. ... price:32
  6. ... }
  7. ... )
  8. WriteResult({ "nInserted" : 1 })
  9. > db.books.insert({name:"Python入门",price:48})
  10. WriteResult({ "nInserted" : 1 })
  11. > db.books.find()
  12. { "_id" : ObjectId("5e0cb711eb18ea3208bc19a8"), "name" : "C语言编程", "price" : 32 }
  13. { "_id" : ObjectId("5e0cb746eb18ea3208bc19a9"), "name" : "Python入门", "price" : 48 }
  14. # insert命令,自动产生一个_id值
  15. # "_id"是十六进制表示(12B):时间戳(4B)+机器ID(3B)+进程ID(2B)+排序流水号(3B)
  16. # insert命令可以用save命令代替。若给save命令指定_id值,则会更新默认_id值;
  17. # 集合books不存在,则会创建,如存在,则变成多条文档的集合

利用中括号,实现一次多条文档插入

  1. > db.books.insert(
  2. ... [ {name:"小学生教材",price:20},
  3. ... {name:"初中生教材",price:30},
  4. ... {name:"高中生教材",price:40}
  5. ... ]
  6. ... )
  7. BulkWriteResult({
  8. "writeErrors" : [ ],
  9. "writeConcernErrors" : [ ],
  10. "nInserted" : 3,
  11. "nUpserted" : 0,
  12. "nMatched" : 0,
  13. "nModified" : 0,
  14. "nRemoved" : 0,
  15. "upserted" : [ ]
  16. })

可以使用变量方式插入文档

  1. > document = ({name:"英文教材",price:49})
  2. { "name" : "英文教材", "price" : 49 }
  3. > db.books.insert(document)
  4. WriteResult({ "nInserted" : 1 })

查询文档

语法:

  1. db.集合名.findOne() #查询一行
  2. db.集合名.find() #查询全部
  3. db.集合名.find().pretty() #格式化打印
  4. db.集合名.find({查找条件}) #按照条件进行查找

查询一条记录

  1. > db.books.findOne()
  2. {
  3. "_id" : ObjectId("5e0cb711eb18ea3208bc19a8"),
  4. "name" : "C语言编程",
  5. "price" : 32
  6. }

查询所有记录

  1. > db.books.find().pretty()
  2. {
  3. "_id" : ObjectId("5e0cb711eb18ea3208bc19a8"),
  4. "name" : "C语言编程",
  5. "price" : 32
  6. }
  7. {
  8. "_id" : ObjectId("5e0cb746eb18ea3208bc19a9"),
  9. "name" : "Python入门",
  10. "price" : 48
  11. }
  12. {
  13. "_id" : ObjectId("5e0cb8e0eb18ea3208bc19aa"),
  14. "name" : "Java学习",
  15. "price" : 65
  16. }
  17. {
  18. "_id" : ObjectId("5e0cbbd2eb18ea3208bc19b7"),
  19. "name" : "小学生教材",
  20. "price" : 20
  21. }
  22. {
  23. "_id" : ObjectId("5e0cbbd2eb18ea3208bc19b8"),
  24. "name" : "初中生教材",
  25. "price" : 30
  26. }
  27. {
  28. "_id" : ObjectId("5e0cbbd2eb18ea3208bc19b9"),
  29. "name" : "高中生教材",
  30. "price" : 40
  31. }
  32. {
  33. "_id" : ObjectId("5e0cbc16eb18ea3208bc19ba"),
  34. "name" : "英文教材",
  35. "price" : 49
  36. }

等价条件查询

公共查询条件:{:,…},多条件时进行与(and)条件查询。

  1. > db.books.find({price:30}).pretty()
  2. {
  3. "_id" : ObjectId("5e0cbbd2eb18ea3208bc19b8"),
  4. "name" : "初中生教材",
  5. "price" : 30
  6. }

带$in运算符的查询

用带$in运算符实现或(or)条件查找,代码如下:

  1. db.books.find({price:{$in:[20,30,40]}}).pretty()
  2. {
  3. "_id" : ObjectId("5e0cbbd2eb18ea3208bc19b7"),
  4. "name" : "小学生教材",
  5. "price" : 20
  6. }
  7. {
  8. "_id" : ObjectId("5e0cbbd2eb18ea3208bc19b8"),
  9. "name" : "初中生教材",
  10. "price" : 30
  11. }
  12. {
  13. "_id" : ObjectId("5e0cbbd2eb18ea3208bc19b9"),
  14. "name" : "高中生教材",
  15. "price" : 40
  16. }

通过查询操作符来查询

公共查询条件:{:{:},…}

find()的查找条件操作符及实例

操作符 格式 实例 与TRDB的类似语句
小于 {:{$lt:}} db.books.find({price:{$lt:30}}) where price<30
小于等于 {:{$lte:}} db.books.find({price:{$lte:30}}) where price<=30
大于 {:{$gt:}} db.books.find({price:{$gt:30}}) where price>30
大于等于 {:{$gte:}} db.books.find({price:{$gte:30}}) where price>=30
不等于 {:{$ne:}} db.books.find({price:{$ne:30}}) where price!=30
and {key1:value1,key2:value2,…}
or {$or:[{key1:value1},{key2:value2},…]}
正则表达式 :{$regex:/pattern/}

正则实例:

  1. #查询值的固定后一部分
  2. > db.books.find({name:{$regex:/教材$/}}).pretty()
  3. {
  4. "_id" : ObjectId("5e0cbbd2eb18ea3208bc19b7"),
  5. "name" : "小学生教材",
  6. "price" : 20
  7. }
  8. {
  9. "_id" : ObjectId("5e0cbbd2eb18ea3208bc19b8"),
  10. "name" : "初中生教材",
  11. "price" : 30
  12. }
  13. {
  14. "_id" : ObjectId("5e0cbbd2eb18ea3208bc19b9"),
  15. "name" : "高中生教材",
  16. "price" : 40
  17. }
  18. {
  19. "_id" : ObjectId("5e0cbc16eb18ea3208bc19ba"),
  20. "name" : "英文教材",
  21. "price" : 49
  22. }
  23. >
  24. # 查询值的固定前一部分
  25. > db.books.find({name:{$regex:/^C语言/}}).pretty()
  26. {
  27. "_id" : ObjectId("5e0cb711eb18ea3208bc19a8"),
  28. "name" : "C语言编程",
  29. "price" : 32
  30. }
  31. # 查询值的任意部分
  32. > db.books.find({name:{$regex:/Python/}}).pretty()
  33. {
  34. "_id" : ObjectId("5e0cb746eb18ea3208bc19a9"),
  35. "name" : "Python入门",
  36. "price" : 48
  37. }
  38. #不区分大小写
  39. > db.books.find({name:{$regex:/python/i}}).pretty()
  40. {
  41. "_id" : ObjectId("5e0cb746eb18ea3208bc19a9"),
  42. "name" : "Python入门",
  43. "price" : 48
  44. }

区间条件查找

  1. #查找price大于15小于35的值
  2. > db.books.find({price:{$gt:15,$lt:35}}).pretty()
  3. {
  4. "_id" : ObjectId("5e0cb711eb18ea3208bc19a8"),
  5. "name" : "C语言编程",
  6. "price" : 32
  7. }
  8. {
  9. "_id" : ObjectId("5e0cbbd2eb18ea3208bc19b7"),
  10. "name" : "小学生教材",
  11. "price" : 20
  12. }
  13. {
  14. "_id" : ObjectId("5e0cbbd2eb18ea3208bc19b8"),
  15. "name" : "初中生教材",
  16. "price" : 30
  17. }

更新文档

对于集合里插入的文档,若需要修改,则需使用MongoDB提供的文档更新命令。
语法:db.collection.update

修改一条简单的文档

在集合order里,先插入一条订单信息,然后用update命令修改订单名称。

  1. > use test
  2. switched to db test
  3. > db.order.insert(
  4. ... {
  5. ... title:"商品购物单1",
  6. ... amount:35,
  7. ... detail:[
  8. ... {name:"苹果",price:22},{name:"面粉",price:18}
  9. ... ]
  10. ... }
  11. ... )
  12. WriteResult({ "nInserted" : 1 })
  13. > db.order.update(
  14. ... {
  15. ... title:"商品购物单1" #查找条件
  16. ... },
  17. ... {
  18. ... $set:{title:"商品购物单2"} #修改某一值,用$set操作符
  19. ... }
  20. ... )
  21. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

还可以做数值运算

  1. > db.order.update(
  2. ... {
  3. ... title:"商品购物单2"
  4. ... },
  5. ... {$inc:{amount:5}} #$inc操作符做加法运算,可以是正数、负数,小数
  6. ... )
  7. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  8. > db.order.find().pretty()
  9. {
  10. "_id" : ObjectId("5e296c68539bb57c3aa7a6c4"),
  11. "title" : "商品购物单2",
  12. "amount" : 40,
  13. "detail" : [
  14. {
  15. "name" : "苹果",
  16. "price" : 22
  17. },
  18. {
  19. "name" : "面粉",
  20. "price" : 18
  21. }
  22. ]
  23. }
  24. # $mul 可以做乘法运算
  25. # $rename 可以修改错误的键名
  26. # $unset 可以删除一个字段

修改一条文档里的数组和嵌套文档

对文档里的子文档值进行修改,可以通过主Key.SubKey的组合来实现指定子文档字段对应值的修改;对于数组值的修改,可以通过Key.Number的方式指定修改数组值,Number从0,1,…开始,对应数组的第一个下标、第二个下标…

  1. > db.order.insert(
  2. ... {
  3. ... _id:12,
  4. ... title:"商品购物单5",
  5. ... amount:90,
  6. ... unit:"元",
  7. ... detail:[
  8. ... {name:"葡萄",price:60},{name:"面粉",price:30}
  9. ... ],
  10. ... overview:{shop:"京东电子商务平台",shopno:5,address:"地球村"}
  11. ... }
  12. ... )
  13. WriteResult({ "nInserted" : 1 })
  14. > db.order.update(
  15. ... {_id:12},
  16. ... {
  17. ... $set:{
  18. ... "detail.1":{name:"大米",price:40},
  19. ... "overview.address":"北京市丰台区南里道15号"
  20. ... }
  21. ... }
  22. ... )
  23. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  24. > db.order.find({_id:12}).pretty()
  25. {
  26. "_id" : 12,
  27. "title" : "商品购物单5",
  28. "amount" : 90,
  29. "unit" : "元",
  30. "detail" : [
  31. {
  32. "name" : "葡萄",
  33. "price" : 60
  34. },
  35. {
  36. "name" : "大米",
  37. "price" : 40
  38. }
  39. ],
  40. "overview" : {
  41. "shop" : "京东电子商务平台",
  42. "shopno" : 5,
  43. "address" : "北京市丰台区南里道15号"
  44. }
  45. }
  46. #MongoDB数组下标从0开始
  47. #引用数组或嵌入文档对象时,都需要加""号,中间用点号隔离

多文档修改

默认情况下update命令都执行修改一条文档动作,如果希望能同时修改所有符合条件的文档记录,需要采用multi选项。

  1. > db.order.update(
  2. {
  3. "detail.name":"面粉","detail.price":{$lte:30}
  4. },
  5. {
  6. $set:{
  7. "detail.1":{name:"面粉",price:40}
  8. }
  9. },
  10. {
  11. multi:true
  12. }
  13. )
  14. #修改所有面粉价格小于等于30的文档记录,把面粉价格改成40.

删除文档

  • db.集合名.remove({查询条件}) # 删除符合条件的文档
  • db.集合名.remove({}) # 删除全部数据
  1. > db.tests.insertMany(
  2. ... [
  3. ... {item:"铅笔",price:2},
  4. ... {item:"钢笔",price:60}
  5. ... ]
  6. ... )
  7. > db.tests.remove( { price:{$lt:3} } )
  8. WriteResult({ "nRemoved" : 1 })
  9. > db.tests.find()
  10. { "_id" : ObjectId("5e29b868aea6d6e19a603530"), "item" : "钢笔", "price" : 60 }
  11. > db.tests.remove( { } )
  12. WriteResult({ "nRemoved" : 1 })
  13. > db.tests.find()
  14. #如果要删除整个集合,采用db.tests.drop()方法效率更高,它会把整个集合和索引一起删除

MongoDB常用配置参数

您可以在启动时使用配置文件进行配置mongod和mongos实例。配置文件包含与mongod和mongos命令行选项等效的设置。使用配置文件让管理mongod和mongos选项更加容易,尤其是对于大规模部署而言。

在Linux上,配置文件为/etc/mongod.conf。

MongoDB配置文件使用YAML格式,YAML不支持缩进的制表符:请改用空格。下面是一个样例:

  1. systemLog:
  2. destination: file
  3. path: "/var/log/mongodb/mongod.log"
  4. logAppend: true
  5. storage:
  6. journal:
  7. enabled: true
  8. processManagement:
  9. fork: true
  10. net:
  11. bindIp: 127.0.0.1
  12. port: 27017
  13. setParameter:
  14. enableLocalhostAuthBypass: false
  15. ...

官方配置参数位置: https://docs.mongodb.com/manual/reference/configuration-options/

核心部分

1. systemLog

  1. systemLog:
  2. verbosity: <int> #日志详细程度,0-5,默认为0
  3. quiet: <boolean>
  4. traceAllExceptions: <boolean>
  5. syslogFacility: <string>
  6. path: <string> #日志文件路径
  7. logAppend: <boolean> #将新条目追加到现有日志文件的末尾。如果没有此选项,将备份现有日志并创建一个新文件;
  8. logRotate: <string>
  9. destination: <string> #MongoDB将所有日志输出发送到的目标。指定 file或syslog。如果指定file,则还必须指定 systemLog.path。
  10. timeStampFormat: <string> #日志时间戳格式:ctime、iso8601-utc(默认值)、iso8601-local
  11. component:
  12. accessControl:
  13. verbosity: <int>
  14. command:
  15. verbosity: <int>
  16. replication:
  17. verbosity: <int>
  18. election:
  19. verbosity: <int>
  20. heartbeats:
  21. verbosity: <int>
  22. initialSync:
  23. verbosity: <int>
  24. rollback:
  25. verbosity: <int>
  26. storage:
  27. verbosity: <int>
  28. journal:
  29. verbosity: <int>
  30. recovery:
  31. verbosity: <int>
  32. write:
  33. verbosity: <int>

2. processManagement

  1. processManagement:
  2. fork: <boolean> #是否为后台守护进程方式启动,默认值为false
  3. pidFilePath: <string> #指定本地pidfile
  4. timeZoneInfo: <string>

3. net

网络配置部分,4.2版本做了更改,不建议使用ssl选项,而推荐使用tls选项

  1. net:
  2. port: <int> #侦听端口,默认27017
  3. bindIp: <string> #绑定的IP地址,可以是主机名、IP地址或unix socket文件,默认localhost
  4. bindIpAll: <boolean> #是否绑定到所有的IP地址,默认false
  5. maxIncomingConnections: <int> #接收的最大连接数,如果高于操作系统的配置,则无效,默认值65536
  6. wireObjectCheck: <boolean> #默认为true,在收到客户端提交的请求时,进行内容验证,以防止客户端将错误或无效的BSON数据插入MongoDB数据库。
  7. ipv6: <boolean> #设置为true为启用IPV6支持,默认为false
  8. unixDomainSocket:
  9. enabled: <boolean> #启用或禁用unix socket侦听,默认为true
  10. pathPrefix: <string>
  11. filePermissions: <int>
  12. tls:
  13. certificateSelector: <string> #Windows和macOS上使用
  14. clusterCertificateSelector: <string>
  15. mode: <string> #开启TLS用于所有的网络连接。disabled、allowTLS、preferTLS、requireTLS
  16. certificateKeyFile: <string> #包含TLS证书和密钥的.pem文件
  17. certificateKeyFilePassword: <string> #解密证书文件的密码
  18. clusterFile: <string>
  19. clusterPassword: <string>
  20. CAFile: <string> #包含来自证书颁发机构的根证书链的.pem文件。使用相对或绝对路径指定.pem文件的文件名
  21. clusterCAFile: <string>
  22. CRLFile: <string> #包含证书吊销列表的.pem文件。使用相对或绝对路径指定.pem文件的文件名。
  23. allowConnectionsWithoutCertificates: <boolean> #对于不存在证书的客户端,mongos或mongod在建立连接时会绕过TLS/SSL证书验证。
  24. allowInvalidCertificates: <boolean>
  25. allowInvalidHostnames: <boolean>
  26. disabledProtocols: <string>
  27. FIPSMode: <boolean>
  28. compression:
  29. compressors: <string> #mongod或mongos实例间通信的默认压缩程序
  30. serviceExecutor: <string>
mode 值 描述
disabled 服务器不使用TLS
allowTLS 服务器之间的连接不使用TLS,对于进来的连接,服务器接收TLS和no-TLS
preferTLS 服务器之间的连接使用TLS,对于进来的连接,服务器接收TLS和no-TLS
requireTLS 服务器仅使用和接收TLS加密连接

net.ssl选项

  1. net:
  2. ssl: # deprecated since 4.2
  3. sslOnNormalPorts: <boolean> # deprecated since 2.6
  4. mode: <string>
  5. PEMKeyFile: <string>
  6. PEMKeyPassword: <string>
  7. certificateSelector: <string>
  8. clusterCertificateSelector: <string>
  9. clusterFile: <string>
  10. clusterPassword: <string>
  11. CAFile: <string>
  12. clusterCAFile: <string>
  13. CRLFile: <string>
  14. allowConnectionsWithoutCertificates: <boolean>
  15. allowInvalidCertificates: <boolean>
  16. allowInvalidHostnames: <boolean>
  17. disabledProtocols: <string>
  18. FIPSMode: <boolean>

security 选项

在生产环境中,必须要重视MongoDB数据库应用的网络安全问题。

  1. security:
  2. keyFile: <string>
  3. clusterAuthMode: <string>
  4. authorization: <string> #启用或禁用基于角色的访问控制(RBAC)以控制每个用户对数据库资源和操作的访问。默认disabled
  5. transitionToAuth: <boolean>
  6. javascriptEnabled: <boolean>
  7. redactClientLogData: <boolean>
  8. clusterIpSourceWhitelist:
  9. - <string>
  10. sasl: #simple authentication and security layer
  11. hostName: <string>
  12. serviceName: <string>
  13. saslauthdSocketPath: <string>
  14. enableEncryption: <boolean> #企业版才会支持
  15. encryptionCipherMode: <string>
  16. encryptionKeyFile: <string>
  17. kmip: #企业版支持,密钥管理互操作协议(key management interoperability protocol)
  18. keyIdentifier: <string>
  19. rotateMasterKey: <boolean>
  20. serverName: <string>
  21. port: <string>
  22. clientCertificateFile: <string>
  23. clientCertificatePassword: <string>
  24. clientCertificateSelector: <string>
  25. serverCAFile: <string>
  26. ldap: #轻量级目录访问互操作协议(Lightweight Directory Access Protocol),企业版才可以使用
  27. servers: <string>
  28. bind:
  29. method: <string>
  30. saslMechanisms: <string>
  31. queryUser: <string>
  32. queryPassword: <string>
  33. useOSDefaults: <boolean>
  34. transportSecurity: <string>
  35. timeoutMS: <int>
  36. userToDNMapping: <string>
  37. authz:
  38. queryTemplate: <string>
  39. validateLDAPServerConfig: <boolean>

storage 选项

存储配置包括了对硬盘和内存的各种操作性能约束的配置

  1. storage:
  2. dbPath: <string> #实例存储数据的目录
  3. indexBuildRetry: <boolean> #指定mongod是否在下次启动时重建不完整的索引,默认为true
  4. journal:
  5. enabled: <boolean> #启用或禁用journal日志以确保数据文件保持有效和可恢复
  6. commitIntervalMs: <num>
  7. directoryPerDB: <boolean> #如果为true,MongoDB将使用单独的目录存储每个数据库的数据。
  8. syncPeriodSecs: <int> #数据刷新到数据库文件的时间间隔,默认60秒
  9. engine: <string> #数据库存储引擎,默认wiredTiger,4.2版本后移除了MMAPv1存储引擎
  10. wiredTiger:
  11. engineConfig:
  12. cacheSizeGB: <number> #设置数据在内存中的缓存空间的大小。
  13. journalCompressor: <string>
  14. directoryForIndexes: <boolean>
  15. maxCacheOverflowFileSizeGB: <number>
  16. collectionConfig:
  17. blockCompressor: <string>
  18. indexConfig:
  19. prefixCompression: <boolean>
  20. inMemory:
  21. engineConfig:
  22. inMemorySizeGB: <number>

用户管理

默认情况下,MongoDB没有开启访问控制,如果开启了访问控制,请确保在admin数据库中有一个具有userAdmin或userAdminAnyDatabase角色的用户。此用户可以管理用户和角色,例如:创建用户、授予或撤消用户的角色,以及创建或修改自定义角色。

开启访问控制

下面就添加一个管理员用户,并开启访问控制

实施步骤:

  1. 添加管理员角色

    1. use admin
    2. db.createUser(
    3. {
    4. user: "admin",
    5. pwd: "Com.123456",
    6. roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
    7. }
    8. )
  2. 查看创建的用户

    1. show users
    2. {
    3. "_id" : "admin.admin",
    4. "userId" : UUID("60585dbb-82b1-464c-91a0-2a600361c869"),
    5. "user" : "admin",
    6. "db" : "admin",
    7. "roles" : [
    8. {
    9. "role" : "userAdminAnyDatabase",
    10. "db" : "admin"
    11. },
    12. {
    13. "role" : "readWriteAnyDatabase",
    14. "db" : "admin"
    15. }
    16. ],
    17. "mechanisms" : [
    18. "SCRAM-SHA-1",
    19. "SCRAM-SHA-256"
    20. ]
    21. }
  3. 关闭MongoDB实例,并启用访问控制
    使用带访问控制的shell命令启动
    或者更改配置文件,启用认证

    1. db.adminCommand( { shutdown: 1 } )
    1. mongod --auth --port 27017 --dbpath /var/lib/mongo
    1. [root@slave01 ~]# vim /etc/mongod.conf
    2. security:
    3. authorization: enabled
  4. 连接数据库,两种方式认证
    连接期间提供认证信息
    连接后再进行认证

    1. [root@slave01 ~]# mongo --port 27017 --authenticationDatabase "admin" -u "admin" -p
    2. MongoDB shell version v4.2.2
    3. Enter password:
    4. connecting to: mongodb://127.0.0.1:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
    5. Implicit session: session { "id" : UUID("3b80127d-99f8-4b73-8982-4e2f7a19a8b7") }
    6. MongoDB server version: 4.2.2
    7. > show tables
    8. books
    9. mytest
    10. order
    11. tests
    12. >
    1. [root@slave01 ~]# mongo
    2. MongoDB shell version v4.2.2
    3. connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
    4. Implicit session: session { "id" : UUID("cc7966ec-5b07-45bb-b7d4-282b6b81b5cd") }
    5. MongoDB server version: 4.2.2
    6. > show tables
    7. Warning: unable to run listCollections, attempting to approximate collection names by parsing connectionStatus
    8. > use admin
    9. switched to db admin
    10. > db.auth("admin","Com.123456")
    11. 1
    12. > show tables
    13. system.users
    14. system.version
    15. > use test
    16. switched to db test
    17. > show tables
    18. books
    19. mytest
    20. order
    21. tests
    22. >
  5. 认证成功后,根据需要创建其他角色

    1. use test
    2. db.createUser(
    3. {
    4. user: "myTester",
    5. pwd: "Com.123456",
    6. roles: [ { role: "readWrite", db: "test" },
    7. { role: "read", db: "reporting" } ]
    8. }
    9. )
  6. 使用新创建的用户进行连接

    1. mongo --port 27017 -u "myTester" --authenticationDatabase "test" -p
  7. 插入数据进行测试

    1. db.foo.insert( { x: 1, y: 1 } )

数据备份及恢复

利用MongoDB自带的Mongodump工具可以实现指定数据库备份,也可以通过mongoexport工具实现指定集合备份。

数据库备份及恢复

备份

mongodump工具常用选项:

  • -h dbhost:需要备份数据库所在的位置,远程服务器使用IP:PORT形式或者域名加端口形式
  • -d dbname:需要备份的数据库名
  • -o 备份目标位置(需要提前存在)
  • -u 用户名(需要加引号)
  • -p 密码(需要加引号)
  1. [root@slave01 ~]# mkdir /backup
  2. [root@slave01 ~]# mongodump -d test -o /backup -u "myTester" -p "Com.123456"
  3. [root@slave01 ~]# tree /backup/
  4. /backup/
  5. └── test
  6. ├── books.bson
  7. ├── books.metadata.json
  8. ├── foo.bson
  9. ├── foo.metadata.json
  10. ├── mytest.bson
  11. ├── mytest.metadata.json
  12. ├── order.bson
  13. ├── order.metadata.json
  14. ├── tests.bson
  15. └── tests.metadata.json

恢复

mongorestore工具常用选项:

  • -h dbhost:需要恢复节点的服务器地址加端口号
  • -d dbname:需要恢复的数据库名,恢复时允许跟备份时的名称不一样
  • -u 用户名(需要加引号)
  • -p 密码(需要加引号)
  • –authenticationDatabase:指定认证数据库
  1. [root@slave01 ~]# mongorestore -d test4 /backup/test/ -u "admin" -p "Com.123456" --authenticationDatabase admin
  2. 2020-01-26T20:09:50.735+0800 the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead
  3. 2020-01-26T20:09:50.736+0800 building a list of collections to restore from /backup/test dir
  4. 2020-01-26T20:09:50.736+0800 reading metadata for test4.order from /backup/test/order.metadata.json
  5. 2020-01-26T20:09:50.748+0800 restoring test4.order from /backup/test/order.bson
  6. 2020-01-26T20:09:50.751+0800 reading metadata for test4.books from /backup/test/books.metadata.json
  7. 2020-01-26T20:09:50.751+0800 reading metadata for test4.foo from /backup/test/foo.metadata.json
  8. 2020-01-26T20:09:50.751+0800 no indexes to restore
  9. 2020-01-26T20:09:50.751+0800 finished restoring test4.order (2 documents, 0 failures)
  10. 2020-01-26T20:09:50.752+0800 reading metadata for test4.tests from /backup/test/tests.metadata.json
  11. 2020-01-26T20:09:50.752+0800 reading metadata for test4.mytest from /backup/test/mytest.metadata.json
  12. 2020-01-26T20:09:50.765+0800 restoring test4.tests from /backup/test/tests.bson
  13. 2020-01-26T20:09:50.766+0800 restoring test4.books from /backup/test/books.bson
  14. 2020-01-26T20:09:50.766+0800 no indexes to restore
  15. 2020-01-26T20:09:50.766+0800 finished restoring test4.tests (0 documents, 0 failures)
  16. 2020-01-26T20:09:50.767+0800 no indexes to restore
  17. 2020-01-26T20:09:50.767+0800 finished restoring test4.books (7 documents, 0 failures)
  18. 2020-01-26T20:09:50.777+0800 restoring test4.foo from /backup/test/foo.bson
  19. 2020-01-26T20:09:50.783+0800 no indexes to restore
  20. 2020-01-26T20:09:50.783+0800 finished restoring test4.foo (1 document, 0 failures)
  21. 2020-01-26T20:09:50.789+0800 restoring test4.mytest from /backup/test/mytest.bson
  22. 2020-01-26T20:09:50.793+0800 no indexes to restore
  23. 2020-01-26T20:09:50.793+0800 finished restoring test4.mytest (1 document, 0 failures)
  24. 2020-01-26T20:09:50.793+0800 11 document(s) restored successfully. 0 document(s) failed to restore.

上面的案例将备份的数据库恢复到了test4数据库。

集合备份及恢复过程

可以通过MongoDB自带的mongoexport、mongoimport工具,实现指定集合数据的备份及恢复。

mongoexport 为导出指定数据库集合工具,其导出数据文件数据格式为JSON或CSV,导出文件扩展名可以指定为.JSON或.CSV。

常用选项:

  • -h:服务器地址,可以采用IP:Port形式
  • -d:数据库名称
  • -c:集合名称
  • -f:指定需要导出的字段名称,默认为所有
  • -o:指定需要导出的文件名
  1. [root@slave01 ~]# mongoexport -d test -c books -o /backup/test/test.books.json -u "admin" -p "Com.123456" --authenticationDatabase admin
  2. 2020-01-26T20:17:38.919+0800 connected to: mongodb://localhost/
  3. 2020-01-26T20:17:38.921+0800 exported 7 records
  4. [root@slave01 ~]# cat /backup/test/test.books.json
  5. {"_id":{"$oid":"5e0cb711eb18ea3208bc19a8"},"name":"C语言编程","price":32.0}
  6. {"_id":{"$oid":"5e0cb746eb18ea3208bc19a9"},"name":"Python入门","price":48.0}
  7. {"_id":{"$oid":"5e0cb8e0eb18ea3208bc19aa"},"name":"Java学习","price":65.0}
  8. {"_id":{"$oid":"5e0cbbd2eb18ea3208bc19b7"},"name":"小学生教材","price":20.0}
  9. {"_id":{"$oid":"5e0cbbd2eb18ea3208bc19b8"},"name":"初中生教材","price":30.0}
  10. {"_id":{"$oid":"5e0cbbd2eb18ea3208bc19b9"},"name":"高中生教材","price":40.0}
  11. {"_id":{"$oid":"5e0cbc16eb18ea3208bc19ba"},"name":"英文教材","price":49.0}

mongoimport为导入指定集合数据工具,其导入文件扩展名为.JSON或.CSV。

  1. [root@slave01 ~]# mongoimport -d test -c books --file=/backup/test/test.books.json -u "admin" -p "Com.123456" --authenticationDatabase="admin"
  2. 2020-01-26T20:27:10.315+0800 connected to: mongodb://localhost/
  3. 2020-01-26T20:27:10.320+0800 7 document(s) imported successfully. 0 document(s) failed to import.