programing

동일한 데이터베이스 내에서 컬렉션을 가장 빨리 복사할 수 있는 방법은 무엇입니까?

goodsources 2023. 4. 6. 21:38
반응형

동일한 데이터베이스 내에서 컬렉션을 가장 빨리 복사할 수 있는 방법은 무엇입니까?

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

어떻게 하면 좋을까요?명령어가 있나요, 아니면 각 레코드를 차례로 복사해야 하나요?

알고 있습니다.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

  1. 덤프를 가져오다source_collection

    $ mongodump -d db -c source_collection 
    
  2. 복원처target_collection덤프로부터의 회수

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

두 번째 옵션:$out집약 단계

  1. aggregate 명령어를 실행합니다.source_collection

    > db.source_collection.aggregate([
        {$match: {emailAddress: "apitester@mailinator.com"}},
        {$out: "target_collection"}
      ])
    

세 번째 옵션(최저 속도): 모든 문서를 반복 복사

  1. 의 모든 문서를 루프합니다.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

반응형