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

Jac*_*ack 9 database mongodb nosql

首先请注意这个问题与以下两个不同

MongoDB:将来自多个集合的数据合并为一个..how?

合并MongoDB中的两个集合

MongoDB和"加入"

我将解释如下:

我有两个名为:DB_ADB_B我的mongodb的数据库.

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

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

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

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

一个问题/制约因素是,可用空间现在只有15GB,所以我不能只copy从所有的东西DB_BDB_A.

我想知道我能做到move吗?或者合并两个简单数据库最简单/最好/ 最快的方法是什么?我更喜欢最有效的方式,因为简单地重新插入32GB DB_A将需要相当长的时间.

Ser*_*sev 6

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

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

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


Xav*_*hot 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" }
Run Code Online (Sandbox Code Playgroud)

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