MongoDB:如何将两个集合/数据库合并成一个?

13

我有两个数据库,分别命名为:DB_ADB_B

每个数据库都有一个名为store的集合。

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

实际上,我原本只打算创建DB_A并将所有文档插入DB_A。但后来在进行第二轮插入时,我错误地将数据库名称打错了。

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

一个问题/限制是现在只有15GB的可用空间,因此我不能简单地从DB_B复制所有内容到DB_A

我想知道是否可以执行某种“移动”操作来合并这两个数据库?我希望使用最有效的方式,因为重新将32GB的数据插入到DB_A需要相当长的时间。


2
从DB_B获取第一个文档,如果它不存在于DB_A中,则将其插入DB_A。然后从DB_B中删除该文档。重复此过程直到完成。 - Sergio Tulentsev
@SergioTulentsev 如果我只是使用我的代码将DB_B中的所有内容删除并重新插入到DB_A中,这种方式会比你建议的那种方式慢吗? - Jack
@SergioTulentsev 不,一半在DB_A中,另一半在DB_B中。 - Jack
@SergioTulentsev,您能否把您的评论写成答案?我会标记它。谢谢。 - Jack
1
顺便说一下,删除数据库的操作是db.dropDatabase()。 - Jack
显示剩余5条评论
2个回答

9

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

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

与从源数据库(DB_B)中删除文档不同,您可能希望按批次仅读取文档。这应该更具性能,但稍微难以编码(特别是如果您从未做过这样的事情)。


如何在不同的数据库db_a和db_b之间切换?我正在尝试用Python编写脚本。需要一些指导。 - rkatkam
1
@rkatkam:只需创建两个单独的连接。 - Sergio Tulentsev
好的。还有一个问题,如果我有两个不同机器上同名的数据库,该怎么办?我想合并它们。有什么建议吗? - rkatkam
@rkatkam:我不知道你在说什么,但是你可以在不同的机器上运行它们。或者在同一台机器上的不同端口上运行。或者你可以重命名其中一个数据库,并在同一个mongodb实例中运行它们两个。 - Sergio Tulentsev
我也在考虑复制数据库。谢谢。 - rkatkam
显示剩余2条评论

6

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将使用源集合中的文档替换目标集合中的文档。为了自定义此行为,请检查$mergewhenMatched参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接