在同一个数据库中复制集合的最快方法是什么?

时间:2012-05-16 19:01:15

标签: mongodb

我想在相同数据库中复制一个集合并给它一个 不同的名字 - 基本上是快照。

最好的方法是什么?是否有命令,或者我必须这样做 依次复制每个记录?

我知道cloneCollection命令,但似乎是 仅复制到另一台服务器。

我也知道mongoimportmongoexport,但正如我通过PHP做的那样,我不想调用shell。

8 个答案:

答案 0 :(得分:161)

db.myoriginal.aggregate([ { $match: {} }, { $out: "mycopy" } ])

比在forEach循环中执行许多插入要快得多。

答案 1 :(得分:49)

您有几个选择,但最快的是:

mongodump -d db -c sourcecollection 
mongorestore -d db -c targetcollection --dir=dump/<db>/<sourcecollection.bson>

mongoexport -d db -c sourcecollection | mongoimport -d db -c targetcollection --drop

或在php中:

`mongoexport -d db -c sourcecollection | mongoimport -d db -c targetcollection --drop`;

之后你有

mongo db < script.js

其中,如mongo docs所示,script.js包含类似的内容:

db.myoriginal.find().forEach( function(x){db.mycopy.insert(x)} );

复制集合的最慢(一个数量级或更多)的方法是使用本机php驱动程序 - 只是因为移动信息。但是如果你绝对想要使用db execute函数来避免cli调用,你可以发出上面的mongo查询。

答案 2 :(得分:13)

最简单的&amp;有效的方法是使用copyTo(),所以你可以使用:

db.source.copyTo("target"); 

&安培;如果"target"不存在,则会创建

- 更新 -

根据CopyTo Documentation,因为copyTo()在内部使用eval,复制操作将阻止mongod实例上的所有其他操作。因此不应该用于生产环境。

- 更新 -

因为CopyTo()内部使用eval()&amp;自版本3.0起,eval()已弃用,因此自3.0版以来 CopyTo()也已弃用

答案 3 :(得分:1)

第一个选项(使用mongo dump)

  1. 从集合中获取转储

    mongodump -d db -c source_collection

  2. 从集合中还原

    mongorestore -d db -c target_collection dir = dump / db_name / source_collection.bson

第二个选项

  1. 运行汇总

    db.getCollection('source_collection')。aggregate([{$ match:{“ emailAddress”:“ apitester@mailinator.com”}},{$ out:“ target_collection”}])

第三选项(最慢)

  1. 运行贯穿for循环

    db.getCollection('source_collection')。find()。forEach(function(docs){ db.getCollection('target_collection')。insert(docs); }) print(“ Rolleback完成!”);

答案 4 :(得分:0)

除了AD7six 1st解决方案之外,如果您使用mongoexport / import,请确保您的集合数据类型和mongo配置,如下所述:http://docs.mongodb.org/manual/reference/mongodb-extended-json/

答案 5 :(得分:0)

这是我在python(pymongo)中的实现:

import {Injectable, Module} from '@nestjs/common';
import {NestFactory} from '@nestjs/core';

@Injectable()
export class SlowService {
  constructor() {
    console.log(`Created SlowService`);
  }
}

@Injectable()
export class DbService {
  constructor() {
    console.log(`Created DbService`);
  }
}

@Module({
  imports: [],
  providers: [SlowService, DbService],
  exports: [SlowService, DbService]
})
export class BaseModule {}

@Injectable()
export class OtherService {
  constructor(private service: DbService) {
    console.log(`Created OtherService with dependency DbService`);
  }
}

@Module({
  imports: [BaseModule],
  providers: [OtherService],
})
export class OtherModule {}

@Module({
  imports: [
    BaseModule,
    OtherModule
  ],
})
export class AppModule {}

NestFactory.createApplicationContext(AppModule).then((app) => console.log(' context created'));

答案 6 :(得分:-1)

最快的方式是db.collection.copyTo()

请注意,自3.0版以来不推荐使用它。

答案 7 :(得分:-3)

您可以在mongo shell中使用copyDatabase函数:

http://docs.mongodb.org/manual/tutorial/copy-databases-between-instances/