我想在相同数据库中复制一个集合并给它一个 不同的名字 - 基本上是快照。
最好的方法是什么?是否有命令,或者我必须这样做 依次复制每个记录?
我知道cloneCollection
命令,但似乎是
仅复制到另一台服务器。
我也知道mongoimport
和mongoexport
,但正如我通过PHP做的那样,我不想调用shell。
答案 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)
从集合中获取转储
mongodump -d db -c source_collection
从集合中还原
mongorestore -d db -c target_collection dir = dump / db_name / source_collection.bson
第二个选项
运行汇总
db.getCollection('source_collection')。aggregate([{$ match:{“ emailAddress”:“ apitester@mailinator.com”}},{$ out:“ target_collection”}])
第三选项(最慢)
运行贯穿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/