一、关系型数据库与非关系型数据库简述:
1、关系型数据库:是依据关系模型来创建的数据库,所谓关系模型就是“一对一”、“一对多”、“对多对”等。典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组
优点:
(1)易于维护:都是使用表结构,格式一致;
(2)使用方便:SQL语言通用,可用于复杂查询;
(3)复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
(1)读写性能比较差,尤其是海量数据的高效率读写;
(2)固定的表结构,灵活度稍欠;
(3)高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈
常见关系型数据库:MySQL、Oracle、sql server等
2、非关系型数据库:非关系型数据库主要基于“非关系型模型”,其中非关系型模型有:列模型、键值对模型、文档类模型。比如redis属于键值对模型。 MongoDB属于文档模型
优点:
(1)格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
(2)速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
(3)高扩展性;
(4)成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
(1)不提供sql支持,学习和使用成本较高;
(2)无事务处理;
(3)数据结构相对复杂,复杂查询方面稍欠。
常见非关系型数据库:monogodb、redis、hbase等
MongoDB概念与关系型数据库(RDBMS)非常类似:
SQL概念 MongoDB概念
数据库(database) 数据库(database)
表(table) 集合(collection)
行(row) 文档(document)
列(column) 字段(field)
索引(index) 索引(index)
主键(primary key) _id(字段)
视图(view) 视图(view)
表连接(table joins) 聚合操作($lookup)
数据库(database):最外层的概念,可以理解为逻辑上的名称空间,一个数据库包含多个不同名 称的集合。
集合(collection):相当于SQL中的表,一个集合可以存放多个不同的文档。
文档(document):一个文档相当于数据表中的一行,由多个不同的字段组成。
字段(field):文档中的一个属性,等同于列(column)。
索引(index):独立的检索式数据结构,与SQL概念一致。
id:每个文档中都拥有一个唯一的id字段,相当于SQL中的主键(primary key)。
视图(view):可以看作一种虚拟的(非真实存在的)集合,与SQL中的视图类似。从MongoDB 3.4版本开始提供了视图功能,其通过聚合管道技术实现。
聚合操作($lookup):MongoDB用于实现“类似”表连接(tablejoin)的聚合操作符。
尽管这些概念大多与SQL标准定义类似,但MongoDB与传统RDBMS仍然存在不少差异,包括:
半结构化,在一个集合中,文档所拥有的字段并不需要是相同的,而且也不需要对所用的字段进行 声明。因此,MongoDB具有很明显的半结构化特点。除了松散的表结构,文档还可以支持多级的 嵌套、数组等灵活的数据类型,非常契合面向对象的编程模型。
弱关系,MongoDB没有外键的约束,也没有非常强大的表连接能力。类似的功能需要使用聚合管 道技术来弥补。
二、mongo shell操作:
基础增删改查
1、数据库操作
(1)查看数据库: show dbs
admin 0.000GB
config 0.000GB
local 0.047GB
test 0.000GB
(2)切换到test数据库: use test
> use test
switched to db test
(3)删除当前数据库:db.dropDatabase() #切换要删除的数据库再执行删库操作
2.集合操作:
(1)查看所有集合:show collections
> show collections
st
nick
tes
(2)创建集合:db.createCollection("集合名")
> db.createCollection("nick")
{ "ok" : 1 }
(3)删除集合:remove与drop
清除集合内数据却保留集合结构:db.集合名.remove({}) #如下所示:
> db.dgwd.remove({})
WriteResult({ "nRemoved" : 3 })
> db.dgwd.find()
> show collections
dgwd
dtsj
dtyj
直接将整个集合删除掉:db.集合名.drop() #如下所示:
> db.st.drop()
true
> show collections
nick
tes
注意:当集合不存在时,向集合中插入文档也会创建集合
3、文档操作:db.collection.insertOne()和db.collection.insertMany()
(1)插入文档:db.collection.insert()、db.collection.insertOne()、db.collection.insertMany()
insert可以插入单个或多个文档:db.collection.insertOne()
> db.csng.insert({
... name:"hs",
... xbss:"nd",
... jibdc:"20cn",
... nlrs:"xxmz",
... zjzs:"djdhmn"
... })
WriteResult({ "nInserted" : 1 })
> show collections
csng
embd
haha
nick
ycso
> db.csng.find()
{ "_id" : ObjectId("67f88d772ff9cbf3d1e3e68a"), "name" : "hs", "xbss" : "nd", "jibdc" : "20cn", "nlrs" : "xxmz", "zjzs" : "djdhmn" }
b:插入单个文档 :db.collection.insertOne()
> db.dtsj.insertOne({
... name:"test",
... nl:123,
... jsljf:20,
... nfdkaf:"lskkf",
... zsd:"yw",
... fljx:"nimlgb"
... })
{
"acknowledged" : true,
"insertedId" : ObjectId("67f88eeb2ff9cbf3d1e3e68c")
}
> show collections
dtsj
dtyj
> db.dtsj.find()
{ "_id" : ObjectId("67f88eeb2ff9cbf3d1e3e68c"), "name" : "test", "nl" : 123, "jsljf" : 20, "nfdkaf" : "lskkf", "zsd" : "yw", "fljx" : "nimlgb" }
c:插入多个文档:db.collection.insertMany()
> db.dgwd.insertMany([{lls:"sfdsa", nsl:"dsaf", age:324, kladl:"sljo"}, {mzjs:"jskl", hsla:"sfds", age:"33", knfd:"afa"}, {names:"adfa", age:43, kads:"adfa", ksld:"sdfad", alnf:48, lanf:293}])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("67f8931f2ff9cbf3d1e3e68d"),
ObjectId("67f8931f2ff9cbf3d1e3e68e"),
ObjectId("67f8931f2ff9cbf3d1e3e68f")
]
}
> db.dgwd.find()
{ "_id" : ObjectId("67f8931f2ff9cbf3d1e3e68d"), "lls" : "sfdsa", "nsl" : "dsaf", "age" : 324, "kladl" : "sljo" }
{ "_id" : ObjectId("67f8931f2ff9cbf3d1e3e68e"), "mzjs" : "jskl", "hsla" : "sfds", "age" : "33", "knfd" : "afa" }
{ "_id" : ObjectId("67f8931f2ff9cbf3d1e3e68f"), "names" : "adfa", "age" : 43, "kads" : "adfa", "ksld" : "sdfad", "alnf" : 48, "lanf" : 293 }
注意:db.collection.createMany()的第一个参数需要是数组,不然会报错:
uncaught exception: TypeError: documents.map is not a function :
DBCollection.prototype.insertMany@src/mongo/shell/crud_api.js:307:17
@(shell):1:1
格式:
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
(2)删除文档
remove删除:
db.collection.remove({age:28})// 删除age 等于28的记录
db.collection.remove({age:{$lt:25}}) // 删除age 小于25的记录
db.collection.remove( { } ) // 删除所有记录
db.collection.remove() //报错
示例1:删除age大于30的记录
> db.collection.remove(
... {age:{$gt:30}}
... )
WriteResult({ "nRemoved" : 1 })
> db.collection.find()
{ "_id" : 1, "name" : "Alice", "age" : 25 }
{ "_id" : 2, "name" : "Bob", "age" : 30 }
官方推荐使用deleteOne()和deleteMany()方法删除文档,语法格式如下
db.books.deleteMany ({}) //删除集合下全部文档
db.books.deleteMany ({ type:"novel" }) //删除 type等于 novel 的全部文档
db.books.deleteOne ({ type:"novel" }) //删除 type等于novel 的一个文档
示例1:使用deleteOne删除单个文档:deleteOne
> db.xingxi.deleteOne(
... {name: "Alice"})
{ "acknowledged" : true, "deletedCount" : 1 }
查看操作后信息
> db.xingxi.find()
{ "_id" : 2, "name" : "Bob", "hobbies" : [ "coding" ] }
{ "_id" : 3, "name" : "Charlie", "hobbies" : [ "conding" ] }
示例2:使用deleteMany删除多个文档:deleteMany
> db.ycso.deleteMany(
... {name:"sgsw"})
{ "acknowledged" : true, "deletedCount" : 2 }
执行操作后查看集合信息:
> db.ycso.find()
>
注意: remove、deleteMany等命令需要对查询范围内的文档逐个删除,如果希望删除整个集合,则使 用drop命令会更加高效
(3)查询文档:
db.collection.find(query, projection)
query 参数
作用:用于指定查询条件,筛选出符合条件的文档。
结构:是一个 JSON 对象,包含字段名和对应的匹配条件。
db.collection.find({ age: { $gt: 25 } })
这里的 query 是 { age: { $gt: 25 } },表示筛选出 age 字段值大于 25 的文档。
projection 参数
作用:用于控制返回文档中包含哪些字段。它决定了结果集中每个文档的字段显示情况。
结构:是一个 JSON 对象,包含字段名和对应的值(通常是 1 或 0),用来指定字段是否包含在结果中。
1 表示包含该字段。
0 表示排除该字段。
db.collection.find({ age: { $gt: 25 } }, { name: 1, age: 1, _id: 0 })
这里的 projection 是 { name: 1, age: 1, _id: 0 },表示只返回 name 和 age 字段,并排除 _id 字段。
findOne查询集合中的第一个文档。语法格式如下:
db.collection.findOne(query, projection)
参数 含义 示例输入
query 查询条件,用于筛选文档 { age: { $gt: 25 } }
projection 控制返回字段,用于格式化输出 { name: 1, age: 1, _id: 0 }
#查询带有nosql标签的book文档:
db.books.find({tag:"nosql"})
#按照id查询单个book文档:
db.books.find({_id:ObjectId("61caa09ee0782536660494d9")})
#查询分类为“travel”、收藏数超过60个的book文档:
db.books.find({type:"travel",favCount:{$gt:60}})
查询条件对照表
SQL MQL
a =1 {a: 1}
a <> 1 {a: {$ne: 1}}
a > 1 {a: {$gt: 1}}
a >= 1 {a: {$gte: 1}}
a < 1 {a: {$lt: 1}}
a <=1 {a: {$lte: 1}}
查询逻辑对照表
SQL MQL
a = 1 AND b = 1 {a: 1, b: 1}或{$and: [{a: 1}, {b: 1}]}
a = 1 OR b = 1 {$or: [{a: 1}, {b: 1}]}
a IS NULL {a: {$exists: false}}
a IN (1, 2, 3) {a: {$in: [1, 2, 3]}}
查询逻辑运算符
$lt: 存在并小于
$lte: 存在并小于等于
$gt: 存在并大于
$gte: 存在并大于等于
$ne: 不存在或存在但不等于
$in: 存在并在指定数组中
$nin: 不存在或不在指定数组中
$or: 匹配两个或多个条件中的一个
$and: 匹配全部条件
(4)更新文档
db.collection.update(query,update,options)
query:描述更新的查询条件
update:描述更新的动作及新的内容;
update:描述更新的动作及新的内容;
upsert: 可选,如果不存在update的记录,是否插入新的记录。默认false,不插入
multi: 可选,是否按条件查询出的多条记录全部更新。 默认false,只更新找到的第一条记录
writeConcern :可选,决定一个写操作落到多少个节点上才算成功。
更新操作符
操作符 格式 描述
$set {$set:{field:value}} 指定一个键并更新值,若键不存在则创 建
$unset {$unset : {field : 1 }} 删除一个键
$inc {$inc : {field : value } } 对数值类型进行增减
$rename {$rename : {old_field_name : new_field_name } } 修改字段名称
$push { $push : {field : value } } 将数值追加到数组中,若数组不存在则 会进行初始化
$pushAll {$pushAll : {field : value_array }} 追加多个值到一个数组字段内
$pull {$pull : {field : _value } } 从数组中删除指定的元素
$addToSet {$addToSet : {field : value } } 添加元素到数组中,具有排重功能
$pop {$pop : {field : 1 }} 删除数组的第一个或最后一个元素
示例1:更新字段:$set
匹配name文档,修改ago字段值为18
> db.haha.update( {name: "nna"}, {$set: {age: 18}} )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
#nMatched:已匹配 nUpserted:未成功 nModified:已修改
执行操作后:
> db.haha.find()
{ "_id" : ObjectId("67f886e42ff9cbf3d1e3e685"), "name" : "nna", "age" : 18 }
{ "_id" : ObjectId("67f8870e2ff9cbf3d1e3e686"), "name" : "nna", "age" : "32", "xb" : "nan" }
将null或者
匹配xb文档,修改xb字段为fftq
> db.haha.update( {xb: "nan"}, {$set: {xb:"fftq"}} )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
#nMatched:已匹配 nUpserted:未成功 nModified:已修改
执行操作后查看
> db.haha.find()
{ "_id" : ObjectId("67f886e42ff9cbf3d1e3e685"), "name" : "nna", "age" : 18 }
{ "_id" : ObjectId("67f8870e2ff9cbf3d1e3e686"), "name" : "nna", "age" : "32", "xb" : "fftq" }
匹配xb文档,修改age字段值为24
> db.haha.update(
... {xb:"fftq"},
... {$set: {age:24}}
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
执行操作后查看
> db.haha.find()
{ "_id" : ObjectId("67f886e42ff9cbf3d1e3e685"), "name" : "nna", "age" : 18 }
{ "_id" : ObjectId("67f8870e2ff9cbf3d1e3e686"), "name" : "nna", "age" : 24, "xb" : "fftq" }
示例2;删除字段:$unset
> db.haha.find()
{ "_id" : ObjectId("67f886e42ff9cbf3d1e3e685"), "name" : "nna", "age" : 18, "xzzd" : "shuaige" }
{ "_id" : ObjectId("67f8870e2ff9cbf3d1e3e686"), "name" : "nna", "age" : 24, "xb" : "fftq" }
匹配age:24文档,删除xb字段
> db.haha.update( {age:24}, {$unset: {xb: ""}} )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
执行操作后:
> db.haha.find()
{ "_id" : ObjectId("67f886e42ff9cbf3d1e3e685"), "name" : "nna", "age" : 18, "xzzd" : "shuaige" }
{ "_id" : ObjectId("67f8870e2ff9cbf3d1e3e686"), "name" : "nna", "age" : 24 }
示例3;对数值类型进行增减:inc
对下方集合的name文档中的 age 字段值加 1。#如果 age 不存在,则会初始化为 1。
> db.ycso.find()
{ "_id" : ObjectId("67f88bc82ff9cbf3d1e3e688"), "name" : "sgsw", "fslj" : "32", "xb" : "nansheng", "mz" : "miaozu" , "age" : 1}
{ "_id" : ObjectId("67f88be22ff9cbf3d1e3e689"), "name" : "sgsw", "fslj" : "32", "xb" : "nansheng", "mz" : "miaozu", "zjxy" : "wdj" }
匹配name文档,对age数值加1
> db.ycso.update( {name: "sgsw"}, {$inc: {age: 1}} )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.ycso.find()
{ "_id" : ObjectId("67f88bc82ff9cbf3d1e3e688"), "name" : "sgsw", "fslj" : "32", "xb" : "nansheng", "mz" : "miaozu", "age" : 2 }
{ "_id" : ObjectId("67f88be22ff9cbf3d1e3e689"), "name" : "sgsw", "fslj" : "32", "xb" : "nansheng", "mz" : "miaozu", "zjxy" : "wdj" }
示例4:将like:buzhi文档中的paz字段修改为test_paz:$rename
> db.embd.find()
{ "_id" : ObjectId("67f887782ff9cbf3d1e3e687"), "like" : "buzhi", "paz" : "aniow", "nl" : "82" }
匹配like文档,修改paz字段值为test_paz
> db.embd.update(
... {like:"buzhi"},
... {$rename: {paz:"test_paz"}}
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
查看paz是否修改成功
> db.embd.find()
{ "_id" : ObjectId("67f887782ff9cbf3d1e3e687"), "like" : "buzhi", "nl" : "82", "test_paz" : "aniow" }
示例5:向数组文档中追加数组:$push
> db.sz.find()
{ "_id" : 1, "name" : "Alice", "age" : 20 }
{ "_id" : 2, "name" : "Bob", "age" : 25 }
{ "_id" : 3, "name" : "Charlie", "age" : 30 }
匹配name:Bob文档,追加texi数组
> db.sz.update(
... {name:"Bob"},
... {$push: {texi: "jsf"}}
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
执行操作后查看:
> db.sz.find()
{ "_id" : 1, "name" : "Alice", "age" : 20 }
{ "_id" : 2, "name" : "Bob", "age" : 25, "texi" : [ "jsf" ] }
{ "_id" : 3, "name" : "Charlie", "age" : 30 }
示例6:从数组中删除指定元素:$pull
删除Bor文档中texi数组值jsf:
> db.sz.update(
... {name: "Bob"},
... {$pull: {texi: "jsf"}}
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
执行操作后查看:
> db.sz.find()
{ "_id" : 1, "name" : "Alice", "age" : 20 }
{ "_id" : 2, "name" : "Bob", "age" : 25, "texi" : [ ] }
{ "_id" : 3, "name" : "Charlie", "age" : 30 }
示例7:向数组中添加元素,并具有排重功能:$addToSet
如果texi数组中已经包含devtest元素,则不会添加,否则会添加devtest元素
> db.sz.update(
... {name:"Bob"},
... {$addToSet: {texi: "devtest"}}
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
执行操作后查看:
> db.sz.find()
{ "_id" : 1, "name" : "Alice", "age" : 20 }
{ "_id" : 2, "name" : "Bob", "age" : 25, "texi" : [ "devtest" ] }
{ "_id" : 3, "name" : "Charlie", "age" : 30 }
尝试再次添加
> db.sz.update( {name:"Bob"}, {$addToSet: {texi: "devtest"}} )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
示例8:删除数组的第一个或最后一个元素:$pop #-1是第一个,1是最后一个
删除下方集合Bor文档中数组第一个和最后一个元素
> db.sz.find()
{ "_id" : 1, "name" : "Alice", "age" : 20 }
{ "_id" : 2, "name" : "Bob", "age" : 25, "texi" : [ "nake", "cs", "ce", "ld" ] }
{ "_id" : 3, "name" : "Charlie", "age" : 30 }
删除第一个元素:
> db.sz.update( {name: "Bob"}, {$pop: {texi:-1}} )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
执行操作后查看:
> db.sz.find()
{ "_id" : 1, "name" : "Alice", "age" : 20 }
{ "_id" : 2, "name" : "Bob", "age" : 25, "texi" : [ "cs", "ce", "ld" ] }
{ "_id" : 3, "name" : "Charlie", "age" : 30 }
删除最后一个元素:
> db.sz.update(
... {name:"Bob"},
... {$pop: {texi:1}}
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
执行操作后查看:
> db.sz.find()
{ "_id" : 1, "name" : "Alice", "age" : 20 }
{ "_id" : 2, "name" : "Bob", "age" : 25, "texi" : [ "cs", "ce" ] }
{ "_id" : 3, "name" : "Charlie", "age" : 30 }
三、mongodb数据库导入导出
1、数据库备份(导出)
mongodump -u 用户名 -p 密码 -h 主机IP --port 端口 -d 数据库 -o 备份路径
-h 指明数据库宿主机的IP
--port 指明数据库的端口
-u 指明数据库的用户名
-p 指明数据库的密码
-d 指明数据库的名字
-c 指明collection的名字
-o 指明到要导出的文件名
-q 指明导出数据的过滤条件
--type : 输出的格式,默认为json
-f :输出的字段,如果-type为csv,则需要加上-f "字段名"
--authenticationDatabase 参数指定了存储用户凭据(用户名和密码)的数据库。
示例1:指定test数据库导出:
/mongodb/apps/bin/mongodump -h xxx.xxx.xxx.xxx:27017 -u admin -pxxxxxxxxxx --authenticationDatabase=admin -dtest -o /root/bak-20250416214734
ls查看/root/bak-20250416214734目录,正常会有一个test的数据目录
ls /root/bak-20250416214734
total 4
drwxr-xr-x. 2 root root 4096 Apr 16 22:20 test
tree命令查看目录
└── test
├── csng.bson
├── csng.metadata.json
├── embd.bson
├── embd.metadata.json
├── haha.bson
├── haha.metadata.json
├── nick.bson
├── nick.metadata.json
├── sz.bson
├── sz.metadata.json
├── user.bson
├── user.metadata.json
├── xingxi.bson
├── xingxi.metadata.json
├── ycso.bson
└── ycso.metadata.json
示例2:导出所有数据库(不加-d参数即可)
/mongodb/apps/bin/mongodump -h xxx.xxx.xxx.xxx:27017 -u admin -pxxxxxxxxxx --authenticationDatabase=admin -o /root/bak-20250416214734
tree命令查看目录
├── test
│ ├── csng.bson
│ ├── csng.metadata.json
│ ├── embd.bson
│ ├── embd.metadata.json
│ ├── haha.bson
│ ├── haha.metadata.json
│ ├── nick.bson
│ ├── nick.metadata.json
│ ├── sz.bson
│ ├── sz.metadata.json
│ ├── user.bson
│ ├── user.metadata.json
│ ├── xingxi.bson
│ ├── xingxi.metadata.json
│ ├── ycso.bson
│ └── ycso.metadata.json
└── yw
├── ddm_config_affix.bson
├── ddm_config_affix.metadata.json
├── dgwd.bson
├── dgwd.metadata.json
├── dtsj.bson
├── dtsj.metadata.json
├── dtyj.bson
└── dtyj.metadata.json
2、数据库还原(导入) #注意:千万别把admin跟config的库给导入,会出大问题的!!
--host <:port>, -h <:port>:数据库所在服务器地址,默认为: localhost:27017
--db , -d :需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test
--drop:恢复数据时,先删除数据库内当前数据,再恢复备份的数据。慎用!
<path>:mongorestore 最后的一个参数
示例1:恢复test数据库数据
/mongodb/apps/bin/mongorestore --host xxx.xxx.xxx.xxx:27017 --username admin --password xxxxxxxxx --authenticationDatabase=admin -dtest /root/bak-20250416214734/test --drop
命令执行成功会有如下输出
2025-04-16T22:35:02.742+0800 The --db and --collection flags are deprecated for this use-case; please use --nsInclude instead, i.e. with --nsInclude=${DATABASE}.${COLLECTION}
2025-04-16T22:35:02.743+0800 building a list of collections to restore from /root/bak-20250416214734/test dir
2025-04-16T22:35:02.750+0800 reading metadata for test.sz from /root/bak-20250416214734/test/sz.metadata.json
2025-04-16T22:35:02.783+0800 reading metadata for test.user from /root/bak-20250416214734/test/user.metadata.json
2025-04-16T22:35:02.797+0800 restoring test.sz from /root/bak-20250416214734/test/sz.bson
2025-04-16T22:35:02.799+0800 reading metadata for test.xingxi from /root/bak-20250416214734/test/xingxi.metadata.json
2025-04-16T22:35:02.876+0800 restoring test.xingxi from /root/bak-20250416214734/test/xingxi.bson
2025-04-16T22:35:02.918+0800 reading metadata for test.haha from /root/bak-20250416214734/test/haha.metadata.json
2025-04-16T22:35:02.918+0800 no indexes to restore
2025-04-16T22:35:02.918+0800 finished restoring test.sz (3 documents, 0 failures)
2025-04-16T22:35:02.919+0800 restoring test.user from /root/bak-20250416214734/test/user.bson
2025-04-16T22:35:02.926+0800 reading metadata for test.embd from /root/bak-20250416214734/test/embd.metadata.json
2025-04-16T22:35:02.971+0800 restoring test.haha from /root/bak-20250416214734/test/haha.bson
2025-04-16T22:35:02.973+0800 no indexes to restore
2025-04-16T22:35:02.974+0800 finished restoring test.xingxi (2 documents, 0 failures)
2025-04-16T22:35:02.974+0800 no indexes to restore
2025-04-16T22:35:02.974+0800 finished restoring test.user (2 documents, 0 failures)
2025-04-16T22:35:03.008+0800 restoring test.embd from /root/bak-20250416214734/test/embd.bson
2025-04-16T22:35:03.029+0800 reading metadata for test.nick from /root/bak-20250416214734/test/nick.metadata.json
2025-04-16T22:35:03.029+0800 reading metadata for test.csng from /root/bak-20250416214734/test/csng.metadata.json
2025-04-16T22:35:03.030+0800 no indexes to restore
2025-04-16T22:35:03.030+0800 finished restoring test.haha (2 documents, 0 failures)
2025-04-16T22:35:03.045+0800 reading metadata for test.ycso from /root/bak-20250416214734/test/ycso.metadata.json
2025-04-16T22:35:03.078+0800 restoring test.csng from /root/bak-20250416214734/test/csng.bson
2025-04-16T22:35:03.088+0800 restoring test.nick from /root/bak-20250416214734/test/nick.bson
2025-04-16T22:35:03.090+0800 no indexes to restore
2025-04-16T22:35:03.090+0800 finished restoring test.embd (1 document, 0 failures)
2025-04-16T22:35:03.090+0800 no indexes to restore
2025-04-16T22:35:03.090+0800 finished restoring test.csng (0 documents, 0 failures)
2025-04-16T22:35:03.129+0800 restoring test.ycso from /root/bak-20250416214734/test/ycso.bson
2025-04-16T22:35:03.167+0800 no indexes to restore
2025-04-16T22:35:03.167+0800 finished restoring test.nick (1 document, 0 failures)
2025-04-16T22:35:03.177+0800 no indexes to restore
2025-04-16T22:35:03.177+0800 finished restoring test.ycso (0 documents, 0 failures)
2025-04-16T22:35:03.177+0800 11 document(s) restored successfully. 0 document(s) failed to restore.
参考连接:https://www.cnblogs.com/qijingjing/p/17361230.html#32_446