동일한 데이터베이스 내에서 컬렉션을 가장 빨리 복사할 수 있는 방법은 무엇입니까?
동일한 데이터베이스 내에 컬렉션을 복사하고 다른 이름을 지정합니다. 기본적으로 스냅샷을 만듭니다.
어떻게 하면 좋을까요?명령어가 있나요, 아니면 각 레코드를 차례로 복사해야 하나요?
알고 있습니다.cloneCollection
명령어는 다른 서버에 복사하기 위한 것으로 보입니다.
나도 알아mongoimport
그리고.mongoexport
하지만 PHP를 통해 이 작업을 하기 때문에 셸에 콜아웃을 하고 싶지 않습니다.
> db.myoriginal.aggregate([{$out: "mycopy"}])
많은 삽입을 하는 것보다 훨씬 빠릅니다.forEach
고리.
몇 가지 옵션이 있지만 가장 빠른 방법은 다음과 같습니다.
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
여기서 script.docs에는 mongo docs에 나타나 있듯이 다음과 같은 내용이 포함되어 있습니다.
db.myoriginal.find().forEach( function(x){db.mycopy.insert(x)} );
컬렉션을 복사하는 가장 느린 방법은 단순히 정보를 이동하기 때문에 네이티브 php 드라이버를 사용하는 것입니다.단, db execute 함수를 사용하여 CLI 콜을 절대적으로 피하고 싶다면 위의 mongo 쿼리를 발행할 수 있습니다.
3.0 이전 버전에서는 copyTo()를 실험용으로 사용할 수 있습니다(쓰기 조작을 차단하므로 프로덕션에서는 사용하지 마십시오).
db.source.copyTo("target");
& if (경우)"target"
존재하지 않습니다. 생성될 것입니다.
첫 번째 옵션: 사용mongodump
덤프를 가져오다
source_collection
$ mongodump -d db -c source_collection
복원처
target_collection
덤프로부터의 회수$ mongorestore -d db -c target_collection dir=dump/db_name/source_collection.bson
두 번째 옵션:$out
집약 단계
aggregate 명령어를 실행합니다.
source_collection
> db.source_collection.aggregate([ {$match: {emailAddress: "apitester@mailinator.com"}}, {$out: "target_collection"} ])
세 번째 옵션(최저 속도): 모든 문서를 반복 복사
의 모든 문서를 루프합니다.
source_collection
에 삽입하다target_collection
> db.source_collection.find().forEach((doc) => { db.target_collection.insert(doc); }) && print("Copy completed!");
AD7s6의 첫 번째 솔루션 외에 mongo export/import를 사용하는 경우 아래 설명에 따라 수집 데이터 유형과 mongo 구성을 확인하십시오.http://docs.mongodb.org/manual/reference/mongodb-extended-json/
다음은 python(pymongo)에서의 구현입니다.
def copy_collection(client, from_db, from_coll, to_db=None, to_coll=None):
to_db = from_db if to_db is None else to_db
to_coll = from_coll if to_coll is None else to_coll
assert (to_db != from_db or to_coll != from_coll), "Copy Error: Source and destination can't be same!"
documents = client[from_db][from_coll].find()
client[to_db][to_coll].insert_many([d for d in documents])
저는 이 문의를 통해 그것을 할 수 있었습니다:-
컬렉션 이름 data1이 있고 동일한 인덱스로 새 컬렉션 data2를 만들거나 인덱스를 삭제 또는 추가하려는 경우 이 쿼리를 사용하여 이 작업을 수행할 수 있습니다.
data1에는 인덱스가 있습니다.| FirstName | MiddleName | LastName | Age | 직업
새로운 수집 데이터2 | FirstName | MiddleName | LastName | Age | Location | Date
질문 제 경우 시간이 매우 적게 소요되었습니다(속도는 데이터 양에 따라 다름).
var cursor = db.data1.find();
var data = [];
while(cursor.hasNest()){
var a = cursor.next();
data.push({
"FirstName" : a.FirstName,
"MiddleName" : a.MiddleName,
"LastName" : a.LastName,
"Age" : a.Age,
"Occupation" : a.Occupation,
"Date" : new Date()
});
}
db.data2.insertMany(data)
----- UPDATE -----
메모리 어레이에 내장되어 있기 때문에 대량의 데이터 메모리 소비량이 증가하므로 이 문제를 해결하려면 플래그를 정의해야 합니다.일부 레코드가 끝나면 수집에 현재 데이터를 삽입하고 어레이를 비울 수 있습니다.
가장 빠른 방법은 db.collection.copyTo()입니다.
버전 3.0 이후 권장되지 않습니다.
mongo 쉘에서 copyDatabase 함수를 사용할 수 있습니다.
http://docs.mongodb.org/manual/tutorial/copy-databases-between-instances/
언급URL : https://stackoverflow.com/questions/10624964/whats-the-fastest-way-to-copy-a-collection-within-the-same-database
'programing' 카테고리의 다른 글
WooCommerce - 제품 페이지 카테고리 가져오기 (0) | 2023.04.06 |
---|---|
Ninja 폼 데이터로 페이지 작성 (0) | 2023.04.06 |
반응 네이티브:네이티브 프로펠러 RCTView.maxHeight용 propType 없음 (0) | 2023.04.06 |
JSON 스키마에서의 RegEx 사용 (0) | 2023.04.06 |
Wordpress WP 목록 테이블 임플리테이션 (0) | 2023.04.06 |