MongoDB:如何将两个集合/数据库合并为一个?
我有两个数据库名为:MongoDB:如何将两个集合/数据库合并为一个?,mongodb,database,nosql,Mongodb,Database,Nosql,我有两个数据库名为:DB_A和DB_B 每个数据库都有一个名为store的同名集合 这两个集合都有许多具有完全相同结构的文档{key:“key1”,value:“value1”},等等 实际上,我应该只创建DB\u A并将所有文档插入DB\u A。但后来当我进行第二轮插入时,我犯了一个错误,输入了错误的名称作为数据库名称 现在,每个数据库的大小为32GB,我希望合并两个数据库 一个问题/限制是,现在可用的可用空间只有15GB,因此我不能将所有内容从DB\u B复制到DB\u A 我想知道我是否可
DB_A
和DB_B
每个数据库都有一个名为store
的同名集合
这两个集合都有许多具有完全相同结构的文档{key:“key1”,value:“value1”}
,等等
实际上,我应该只创建DB\u A
并将所有文档插入DB\u A
。但后来当我进行第二轮插入时,我犯了一个错误,输入了错误的名称作为数据库名称
现在,每个数据库的大小为32GB,我希望合并两个数据库
一个问题/限制是,现在可用的可用空间只有15GB,因此我不能将所有内容从DB\u B
复制到DB\u A
我想知道我是否可以执行某种“移动”来合并这两个数据库?我更喜欢最有效的方法,因为简单地将32GB重新插入DB\u A
将花费相当长的时间。我认为最简单(可能也是唯一)的方法是编写一个脚本,将两个数据库文档合并到一个文档中
您可能不想从源数据库(db_B)中删除文档,而只想批量读取文档。这应该性能更高,但编码难度稍高(特别是如果您从未做过这样的事情)。从
Mongo 4.2
开始,新的聚合阶段可用于合并另一个数据库中另一个集合中的集合内容:
// > 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" }
默认情况下,当目标集合和源集合包含具有相同
\u id
的文档时,$merge
将用源集合中的文档替换目标集合中的文档。要自定义此行为,请在匹配时选中$merge
的。从DB_B获取第一个文档。如果尚未存在,请将其插入DB_A。从DB_B中删除它。重复直到完成。@SergioTulentsev如果我只是删除DB_B并使用我的代码重新插入(DB_B的)所有内容到DB_A中,这种方式会比您建议的慢吗?如果您的所有数据都在DB_B中,那么您可以删除DB_A并重命名DB_B。@SergioTulentsev否,一半用分贝表示,另一半用分贝表示_B@SergioTulentsev顺便说一下,drop database操作是db.dropDatabase(),如何在不同的数据库db_a和db_b之间切换?我正在尝试用python编写一个脚本。需要一些指导。@rkatkam:只需创建两个单独的连接。好的。还有一个qtn,如果我有两个同名的独立数据库呢。我应该如何进行?目前我在不同的机器上安装了它们。我想合并它们。有什么想法吗?@rkatkam:那有什么问题吗?我有两个独立的mongodb实例。如果我尝试使用一个,另一个将被覆盖。怎么可能把它们都放在同一台机器里呢?