Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB:如何将两个集合/数据库合并为一个?_Mongodb_Database_Nosql - Fatal编程技术网

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获取第一个文档
  • 如果需要,将其插入DB_A
  • 从DB_B中删除它
  • 重复,直到完成

  • 您可能不想从源数据库(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实例。如果我尝试使用一个,另一个将被覆盖。怎么可能把它们都放在同一台机器里呢?