Mongodb 部分备份/还原集合

Mongodb 部分备份/还原集合,mongodb,amazon-ec2,Mongodb,Amazon Ec2,我目前正在AWS EC2服务器上工作,我收集了一些存储在MongoDB集合中的数据。这是我数据库中唯一的集合 现在,我需要将此集合转移到本地计算机以进行处理。我的问题是,远程计算机上剩余的磁盘空间不足以转储整个集合。大约有60%的收藏空间。 我尝试使用db.copy()和db.export()使用主机名在本地计算机上直接复制,但不起作用,因为我不在本地网络上,并且存在一些身份验证问题,即使使用ssh隧道也是如此 我想做的是将我的大收藏分成两个小收藏,并将每个收藏都转储。可能吗 谢谢大家! 您最好

我目前正在AWS EC2服务器上工作,我收集了一些存储在MongoDB集合中的数据。这是我数据库中唯一的集合

现在,我需要将此集合转移到本地计算机以进行处理。我的问题是,远程计算机上剩余的磁盘空间不足以转储整个集合。大约有60%的收藏空间。 我尝试使用
db.copy()
db.export()
使用主机名在本地计算机上直接复制,但不起作用,因为我不在本地网络上,并且存在一些身份验证问题,即使使用ssh隧道也是如此

我想做的是将我的大收藏分成两个小收藏,并将每个收藏都转储。可能吗


谢谢大家!

您最好的选择是使用
mongodump
只获取集合的一部分。这也是数据“大容量迁移”的最佳选择,因此如果您可以更改主机之间的网络设置以允许这一点,那么有一些使用部分可以应用于在主机之间直接工作

如果只需要在集合的一部分上使用,那么一般情况下是应用选项来选择输出。输出没有“限制”修饰符,因此您需要应用“范围查询”运算符,它们分别是和

作为一个简单的示例集,考虑以下数据:

{u id:ObjectId(“560e4a56a1a451fc8a37057f”),“list”:[1,2,3]}
{“_id”:ObjectId(“560e4a5ca1a451fc8a370580”),“list”:[1,2]}
{“_id”:ObjectId(“560e4a62a1a451fc8a370581”),“list”:[1]}
{“_id”:ObjectId(“560e4a6ca1a451fc8a370582”),“list”:[]
因此,我们的想法是获取所需“切点”处的
\u id
值,并构造范围查询,以仅选择这些范围内的文档。对于这个例子,我们将把输出分成两组

因此,您需要的第一件事是第二个文档的
\u id
(分为两个),您可以通过应用和在mongo shell中检索该文档:

db.sample.find()
这将返回文档:

{u id:ObjectId(“560e4a5ca1a451fc8a370580”),“列表”:[1,2]}
这是通过跳过
n-1
文档到要在此批中导出的编号,然后只输出最后一个文档来完成的

issed
mongodump
将包含
$lte
的范围选择器,以达到该点:

mongodump-d测试-c样本\
--查询“{”\u id:{“$lte:{”$oid:“560e4a5ca1a451fc8a370580”}”\
--第1部分
请注意查询中的。
mongodump
mongoimport
工具都使用中描述的格式。shell可用的助手构造函数(如
ObjectId()
)不是“严格意义上的JSON”,而
mongodump
(或任何带有
--query
选项的工具)只是使用JSON作为输入,因此此类数据以这种形式表示

对于下一点,您希望获得下一个可以放入转储的
n
文档。因此,您希望通过跳过已输出的
n
文档加上到下一个切分点
n-1
的文档数,或基本上跳过
(2+2-1)=3来查询下一个文档切分:

db.sample.find()
或者更好的方法是,使用上次截止日期的
$gt
应用范围:

db.sample.find({“\u id”:{“$gt”:ObjectId(“560e4a5ca1a451fc8a370580”)})。跳过(1)。限制(1)
无论哪种方式,您都可以获得下一个截止文档:

{“_id”:ObjectId(“560e4a6ca1a451fc8a370582”),“list”:[]
然后在转储上应用另一个范围查询,但这次使用
$gt
$lte
运算符:

mongodump-d测试-c样本\
--查询“{”\u id”:{
“$gt”:{“$oid”:“560e4a5ca1a451fc8a370580”},
“$lte”:{“$oid”:“560e4a6ca1a451fc8a370582”}”\
--第二部分
与每个部件一样,您可以根据需要获取数据并将其移动到目标主机。请注意,在此表单中,
--out
指定了一个目录,其中包含文件

请注意,这里也有一些选项可以提供帮助,例如:

-(理想情况下是从)允许您在另一个系统上运行整个流程。例如,您可以在新的目标MongoDB实例中运行以下命令,将数据从源主机直接传输到该系统上的
mongorestore

mongodump——主机orighost-d测试-c示例\
--查询“{”\u id”:{
“$gt”:{“$oid”:“560e4a5ca1a451fc8a370580”},
“$lte”:{“$oid”:“560e4a6ca1a451fc8a370582”}”\
--出-\
|mongorestore-d newtest-c newsample--dir-
注意
-
分别表示每个命令的标准输出/输入

-如果您在两台主机上都安装了MongoDB 3.2,那么您还可以利用此选项来压缩/解压缩上述管道中的数据输出或流。结合管道选项,这将是将数据迁移到新目标主机的最有效的方法

对于
mongorestore
,一般来说,无论您如何应用它,数据都将愉快地重建集合,即使是部分集合。一般行为如标记所示,因此不同的恢复将“添加”到集合中,但不会使用相同的
\u id
值“覆盖”数据

仔细看这些选项。特别是如果您的主机系统都在EC2上,或者甚至都在普通云资源中,那么您就没有理由不能将输出从一个直接传输到另一个。所需要做的就是在允许的主机之间至多配置一点防火墙

但无论如何,如果您只想备份“部分”数据,那么这就是usua