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

时间:2012-06-13 10:18:37

标签: mongodb database nosql

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

MongoDB: Combine data from multiple collections into one..how?

Merging two collections in MongoDB

MongoDB and "joins"

我将解释如下:

我的mongodb中有两个名为DB_ADB_B的数据库。

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

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

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

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

一个问题/限制是现在可用空间仅为15GB,因此我不能只copy DB_BDB_A的所有内容。

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

2 个答案:

答案 0 :(得分:5)

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

  1. 从DB_B获取第一份文件。
  2. 如果需要,将其插入DB_A。
  3. 从DB_B中删除它。
  4. 重复完成。
  5. 您可能只想批量阅读文档,而不是从源db(DB_B)中删除文档。这应该更高效,但编码稍微困难(特别是如果你从未做过这样的事情)。

答案 1 :(得分:3)

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的{​​{1}}参数。