我目前正在使用AWS EC2服务器,并且抓取了一些存储在MongoDB集合中的数据。这是我数据库中的唯一集合。
现在,我需要将此集合转移到我的本地计算机上进行处理。我的问题是我在远程计算机上的剩余磁盘空间不足以转储整个集合。有大约60%的收藏空间。我尝试使用db.copy()
并db.export()
使用主机名直接在本地计算机上进行复制,但由于我不在本地网络上,因此即使使用ssh隧道,也存在一些身份验证问题,因此无法正常工作。
我想做的是将我的大收藏夹分成2个较小的收藏夹,然后将它们分别倾倒。是否有可能?
谢谢!
最好的选择是mongodump
仅使用其中的一部分。对于数据的“批量迁移”也是最好的选择,因此,如果您可以更改主机之间的网络设置以允许这样做,则其中的使用部分可能不适用于直接在主机之间工作。
如果mongodump
只需要在集合的一部分上使用,则通常情况是应用--query
选项来选择输出。没有“限制”修改传至输出所以不是你需要应用“范围查询”运营商,这是$lte
和$gt
repectively。
作为一个简单的示例集,请考虑以下数据:
{ "_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
查询中的。该mongodump
和mongoimport
工具都使用了“严”中所描述的形式MongoDB的扩展JSON。像ObjectId()
Shell那样可用的辅助构造函数不是“严格地JSON”,而像mongodump
(或带有--query
option的任何东西)之类的工具只是使用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] 删除。
我来说两句