12

我有两个名为:DB_ADB_B.

每个数据库都有一个同名的集合,称为store.

两个集合都有很多具有完全相同结构的文档{ key:" key1", value: "value1" }等。

实际上,我应该只创建DB_A所有文档并将其插入到DB_A. 但是后来当我进行第二轮插入时,我犯了一个错误,输入了错误的名称作为数据库名称。

所以现在,每个数据库都有 32GB 的大小,我希望合并两个数据库。

一个问题/限制是现在可用的可用空间只有 15GB,所以我不能只是copyDB_Bto DB_A.

我想知道我是否可以执行某种“移动”来合并两个数据库?我更喜欢最有效的方法,因为简单地将 32GB 重新插入DB_A将需要相当长的时间。

4

2 回答 2

8

我认为最简单(也许是唯一)的方法是编写一个脚本,将两个数据库文档一个接一个地合并。

  1. 从 DB_B 获取第一个文档。
  2. 如果需要,将其插入 DB_A。
  3. 从 DB_B 中删除它。
  4. 重复直到完成。

您可能只想批量读取文档,而不是从源数据库 (DB_B) 中删除文档。这应该更高效,但编码稍微困难一些(特别是如果你从未做过这样的事情)。

于 2012-06-13T11:56:07.457 回答
5

开始Mongo 4.2,新的聚合阶段$merge可用于将集合的内容合并到另一个数据库中的另一个集合中:

// > use db1
// > db.collection.find()
//   { "_id" : 1, "key" : "a", "value" : "b" }
//   { "_id" : 2, "key" : "c", "value" : "d" }
//   { "_id" : 3, "key" : "a", "value" : "b" }
// > use db2
// > db.collection.find()
//   { "_id" : 1, "key" : "e", "value" : "f" }
//   { "_id" : 4, "key" : "a", "value" : "b" }
// > use db1
db.collection.aggregate([
  { $merge: { into: { db: "db2", coll: "coll" } } }
])
// > use db2
// > db.collection.find()
//   { "_id" : 1, "key" : "a", "value" : "b" }
//   { "_id" : 2, "key" : "c", "value" : "d" }
//   { "_id" : 3, "key" : "a", "value" : "b" }
//   { "_id" : 4, "key" : "a", "value" : "b" }

默认情况下,当目标集合和源集合包含相同的文档时_id$merge会将目标集合中的文档替换为源集合中的文档。为了自定义此行为,请检查$merge'swhenMatched参数。

于 2020-03-15T15:56:42.720 回答