零件中的备份/还原集合

托马斯·雷诺

我目前正在使用AWS EC2服务器,并且抓取了一些存储在MongoDB集合中的数据。这是我数据库中的唯一集合。

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

我想做的是将我的大收藏夹分成2个较小的收藏夹,然后将它们分别倾倒。是否有可能?

谢谢!

布雷克七

最好的选择是mongodump仅使用其中的一部分。对于数据的“批量迁移”也是最好的选择,因此,如果您可以更改主机之间的网络设置以允许这样做,则其中的使用部分可能不适用于直接在主机之间工作。

如果mongodump需要在集合的一部分上使用,则通常情况是应用--query选项来选择输出。没有“限制”修改传至输出所以不是你需要应用“范围查询”运营商,这是$lte$gtrepectively。

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

{ "_id" : ObjectId("560e4a56a1a451fc8a37057f"), "list" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("560e4a5ca1a451fc8a370580"), "list" : [ 1, 2 ] }
{ "_id" : ObjectId("560e4a62a1a451fc8a370581"), "list" : [ 1 ] }
{ "_id" : ObjectId("560e4a6ca1a451fc8a370582"), "list" : [ ] }

因此,其想法是_id在所需的“剪切点”处获取值,并构造范围查询以仅选择那些范围内的文档。在此示例中,我们将输出分成两组。

因此,您想要的第一件事是_id第二个文档(位于double中)的文档,您可以通过应用它.skip().limit()在mongo shell中进行检索

db.sample.find().sort({ "_id": 1 }).skip(1).limit(1)

那只是返回文档:

{ "_id" : ObjectId("560e4a5ca1a451fc8a370580"), "list" : [ 1, 2 ] }

通过跳过n-1文档到要在该批次中导出的编号,然后仅输出最后一个文档来完成此操作。

然后,issedmongodump将包含范围选择器,$lte以达到这一点:

mongodump -d test -c sample \
--query '{ "_id": { "$lte": { "$oid": "560e4a5ca1a451fc8a370580" } } }' \
--out part1

注意$oid查询中的。mongodumpmongoimport工具都使用了“严”中所描述的形式MongoDB的扩展JSONObjectId()Shell那样可用的辅助构造函数不是“严格地JSON”,而像mongodump(或带有--queryoption的任何东西)之类的工具只是使用JSON作为输入,因此此类数据以这种形式表示。

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

db.sample.find().sort({ "_id": 1 }).skip(3).limit(1)

甚至更好的是,$gt从上一个截止日期开始应用范围

db.sample.find({ "_id": { "$gt": ObjectId("560e4a5ca1a451fc8a370580") }}).skip(1).limit(1)

无论哪种方式,都可以获取下一份截止文档:

{ "_id" : ObjectId("560e4a6ca1a451fc8a370582"), "list" : [ ] }

然后对转储应用另一个范围查询,但是这次使用$gt$lte运算符:

mongodump -d test -c sample \
--query '{ "_id": { 
    "$gt": { "$oid": "560e4a5ca1a451fc8a370580" },
    "$lte": { "$oid": "560e4a6ca1a451fc8a370582" } }}' \
--out part2

与每个部分一样,您可以获取数据并根据需要将其移至目标主机。请注意,此格式--out指定文件所在的目录

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

--host-(最好来自mongorestore),它可以让您在另一个系统上运行整个过程。因此,例如,您可以在新的目标MongoDB实例中运行以下命令,以将数据从原始主机直接传递到mongorestore该系统上:

mongodump --host orighost -d test -c sample \
--query '{ "_id": { 
    "$gt": { "$oid": "560e4a5ca1a451fc8a370580" },
    "$lte": { "$oid": "560e4a6ca1a451fc8a370582" } }}' \
--out - \
| mongorestore -d newtest -c newsample --dir -

注意-每个命令分别表示标准输出/输入。

--gzip-如果两个主机上都具有MongoDB 3.2,则也可以利用此选项来压缩/解压缩数据输出或流,如上面的管道中所示。结合使用该管道选项,这将是将数据迁移到新目标主机的最有效方法。

至于mongorestore总的来说,无论您如何应用它,数据都会愉快地重建集合,即使是部分也是如此。一般行为被标记为“仅插入”,因此不同的还原将“添加”到集合中,但绝不会“覆盖”具有相同_id值的数据

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

但是,无论如何,如果您只想备份“部分”数据,那么通常这就是进行备份的方法。

当然,根据您自己的设置和身份验证需求,这两个命令可能都需要此处显示的其他选项。这些选项只是“必需”选项,以便从“数据库”中指定“集合”并使用“查询”进行过滤。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何仅使用Ymd零件按created_at日期从集合中获取项目?

来自分类Dev

给定零件权重算法的零件中的C#拆分整数

来自分类Dev

如何知道零件请求中零件的实际内容类型是什么

来自分类Dev

Eclipse e4零件工具栏仅在零件位于零件堆栈中时显示吗?

来自分类Dev

Eclipse e4零件工具栏仅在零件位于零件堆栈中时显示吗?

来自分类Dev

在动态位置插入零件/零件

来自分类Dev

Solr零件号中的破折号

来自分类Dev

如何在Ember中创建局部零件?

来自分类Dev

从Shell脚本中的行数提取通用零件文本

来自分类Dev

fields_for零件在表单中不可见

来自分类Dev

在Rails(500+)中渲染许多零件很慢

来自分类Dev

在Spring Test MVC中设置请求零件

来自分类Dev

MEF Container无法从共享装配中组成零件

来自分类Dev

匹配grok中的版本号零件

来自分类Dev

在Roblox中,销毁的零件不会被销毁

来自分类Dev

如何在Google SketchUp中创建零件清单

来自分类Dev

骨干Js Load零件中的应用程序

来自分类Dev

使用python从pdb文件中删除零件

来自分类Dev

如何使零件在PartStack中可移动

来自分类Dev

在codeigniter中搜索超过2个零件名称

来自分类Dev

fields_for零件在表单中不可见

来自分类Dev

Word在快速零件中创建几个文档属性

来自分类Dev

减少Dart应用中的“零件”数量

来自分类Dev

模板中的Opencart 2加载模板零件

来自分类Dev

计算Dict(Swift)中零件键值的出现次数

来自分类Dev

cURL:在POST中从stdin发送零件数据

来自分类Dev

从零件建立宏

来自分类Dev

零件擦拭磁盘

来自分类Dev

零件是如何命名的?