我目前正在使用AWS EC2服务器,并且我删除了存储在MongoDB集合中的一些数据。这是我数据库中唯一的集合。
现在我需要将此集合传输到本地计算机以进行处理。我的问题是我的远程机器上剩余的磁盘空间不足以转储整个集合。大约60%的收藏品有空间。
我尝试使用[a, c, d, e]
和db.copy()
使用主机名直接复制到我的本地计算机上,但它不起作用,因为我不在本地网络上而且我有一些身份验证问题,即使是ssh隧道。
我想做的是将我的大集合分成两个较小的集合并转储它们。有可能吗?
谢谢!
答案 0 :(得分:2)
您最好的选择是使用mongodump
来收集部分内容。对于"批量迁移而言,这也是最好的事情。如果您可以更改主机之间的网络设置以允许此操作,则数据的使用部分可以应用于直接在主机之间工作。
如果您只需要在集合的一部分上使用mongodump
,那么一般情况是应用--query
选项来选择输出。没有"限制"输出的修饰符,所以你需要应用"范围查询"运算符,分别为$lte
和$gt
。
作为一个简单的示例集,请考虑以下数据:
{ "_id" : ObjectId("560e4a56a1a451fc8a37057f"), "list" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("560e4a5ca1a451fc8a370580"), "list" : [ 1, 2 ] }
{ "_id" : ObjectId("560e4a62a1a451fc8a370581"), "list" : [ 1 ] }
{ "_id" : ObjectId("560e4a6ca1a451fc8a370582"), "list" : [ ] }
因此,我们的想法是在"切割点获得_id
值"您想要并构建范围查询以仅选择这些范围内的文档。对于这个例子,我们将输出分成两组。
所以你想要的第一件事是第二个文件的_id
(两个人),你可以通过在mongo shell中应用.skip()
和.limit()
来检索:
db.sample.find().sort({ "_id": 1 }).skip(1).limit(1)
这只是要返回文件:
{ "_id" : ObjectId("560e4a5ca1a451fc8a370580"), "list" : [ 1, 2 ] }
通过将n-1
个文档跳过到您要在此批次中导出的数字,然后输出最后一个文档来完成。
issed mongodump
将包含$lte
的范围选择器,直到达到这一点:
mongodump -d test -c sample \
--query '{ "_id": { "$lte": { "$oid": "560e4a5ca1a451fc8a370580" } } }' \
--out part1
请注意查询中的$oid
。 mongodump
和mongoimport
工具都使用"strict"中描述的MongoDB Extended JSON表单。 shell可用的ObjectId()
之类的辅助构造函数不是严格的JSON",mongodump
之类的工具(或任何带有--query
选项的工具)只使用JSON作为输入,所以这样的数据就是用这种形式表示的。
下一步,您希望获得可以放入转储的下一个n
文档。因此,您希望通过跳过已输出的n
文档加上下一个截止点n-1
或基本上( 2 + 2 -1 ) = 3
的文档数来查询下一个文档截止值:< / p>
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" : [ ] }
然后在转储上应用另一个范围查询,但这次使用&#34;两者&#34; $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
一般来说,无论你应用它,数据都会很乐意重建集合,即使是部分也是如此。一般行为标记为"Insert Only",因此不同的恢复将&#34;添加&#34;到集合但从未&#34;覆盖&#34; 具有相同_id
值的数据。
仔细查看选项。特别是如果你的主机系统都在EC2上,或者甚至都在一般的云资源中,那么你真的应该没有理由不能将输出从一个直接传输到另一个。所需要的只是允许主机之间最多的防火墙配置。
但无论如何,你只想备份&#34;部分&#34;数据,这通常是做这件事的方式。
当然,根据您自己的设置和身份验证需求,这两个命令可能需要除此处演示的选项之外的其他选项。这里的选项只是&#34; required&#34;选项以指定&#34;集合&#34;来自&#34;数据库&#34;并使用&#34;查询&#34;过滤。