Programing

동일한 데이터베이스 내에서 컬렉션을 복사하는 가장 빠른 방법은 무엇입니까?

lottogame 2020. 11. 29. 09:34
반응형

동일한 데이터베이스 내에서 컬렉션을 복사하는 가장 빠른 방법은 무엇입니까?


동일한 데이터베이스 내에서 컬렉션을 복사하고 다른 이름을 지정 하고 싶습니다 . 기본적으로 스냅 샷을 찍습니다.

이를 수행하는 가장 좋은 방법은 무엇입니까? 명령이 있습니까? 아니면 각 레코드를 차례로 복사해야합니까?

cloneCollection명령 은 알고 있지만 다른 서버로만 복사하는 것 같습니다.

나는 또한 알고 있어요 mongoimport그리고 mongoexport,하지만 난 원합니다 PHP I를 통해이 일을 해요로 쉘에 호출을 할 수 없습니다.


몇 가지 옵션이 있지만 가장 빠른 방법은 다음과 같습니다.

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 문서에 표시된 것처럼 script.js에는 다음과 같은 내용이 포함됩니다.

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

컬렉션을 복사하는 가장 느린 방법은 정보를 이동하기 때문에 네이티브 PHP 드라이버를 사용하는 것입니다. 그러나 db execute 함수를 사용하여 CLI 호출을 절대적으로 피하려면 위의 mongo 쿼리를 발행 할 수 있습니다.


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

forEach 루프에서 많은 삽입을 수행하는 것보다 훨씬 빠릅니다.


참고 : 답변 업데이트를 읽으십시오. 중요합니다!


가장 간단하고 효율적인 방법은 copyTo () 를 사용하는 것이므로 다음을 사용할 수 있습니다.

db.source.copyTo("target"); 

& "target"존재하지 않으면 생성됩니다.

-업데이트-

CopyTo Documentation 에 따르면 copyTo()내부적으로 eval을 사용 하기 때문에 복사 작업은 mongod 인스턴스의 다른 모든 작업을 차단합니다. 따라서 프로덕션 환경에서 사용해서는 안됩니다 .

-업데이트-

때문에 CopyTo()사용 eval()내부적 &는 eval()버전 3.0부터 사용되지 않습니다, 그래서 CopyTo()또한 버전 3.0 이후 사용되지 않습니다 .


AD7six 첫 번째 솔루션 외에도 mongoexport / import를 사용하는 경우 여기에 설명 된대로 컬렉션 데이터 유형과 mongo 구성에 대해 확인하십시오. http://docs.mongodb.org/manual/reference/mongodb-extended-json/


이것은 파이썬 (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])

가장 빠른 방법은 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

반응형