您最好的选择是使用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文档跳过到您要在这批中导出的编号,然后只输出最后一个文档来完成的。
发出的mongodump 将包含$lte 的范围选择器,以达到该点:
mongodump -d test -c sample \
--query '{ "_id": { "$lte": { "$oid": "560e4a5ca1a451fc8a370580" } } }' \
--out part1
注意查询中的$oid。 mongodump 和mongoimport 工具都使用MongoDB Extended JSON 中描述的"strict" 形式。像ObjectId() 这样可用于shell 的辅助构造函数不是“严格意义上的JSON”,而像mongodump(或任何带有--query 选项的工具)这样的工具只是使用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,一般来说,无论您如何应用它,数据都会很高兴地重建集合,即使是部分重建。一般行为标记为"Insert Only",因此不同的还原将“添加”到集合中,但不会“覆盖”具有相同_id值的数据。
仔细查看选项。特别是如果您的主机系统都在 EC2 上,甚至都在通用云资源中,那么您确实没有理由不能将输出从一个直接传送到另一个。最多只需要在允许的主机之间进行一点防火墙配置即可。
但无论如何,如果您只想备份“部分”数据,那么这通常是解决问题的方法。
当然,根据您自己的设置和身份验证需求,这两个命令可能需要除此处演示的选项之外的其他选项。这里的选项只是“必需”选项,以便从“数据库”中指定“集合”并使用“查询”进行过滤。