2016-06-27 7 views
1

에 대한 삽입 된 ID 가져 오기 내 nodeJs 응용 프로그램에 mongoskin을 사용하여 mongo db에 데이터를 삽입합니다. 데이터베이스에 문서 배열을 삽입하고 삽입 된 레코드의 ID를 클라이언트에 다시 전송해야한다는 요구 사항이 있습니다. 그러나 데이터를 삽입 할 수 있지만 결과 개체에 삽입 된 레코드의 ID를 찾을 수 없습니다. 결과에 insertedIds를 찾는 데 도움이 필요합니다. 아래 코드를 사용하여 대량 삽입하십시오.Bulk.Insert() - 몽고 스킨

db.collection('myCollection', function (err, collection) { 
    var bulk = collection.initializeUnorderedBulkOp(); 
    for (var i = 0; i < dataArray.length; i++) { 
     bulk.insert(dataArray[i]); 
    } 

    bulk.execute(function (err, result) { 
     //TODO: return the Ids of inserted records to the client 
     //Client will use these Ids to perform subsequent calls to the nodejs service 
    }); 
}); 

내 결과는 BatchWriteResult 개체 유형입니다.

답변

1

getUpsertedIds() 메소드를 호출하여 BatchWriteResult() 객체에 삽입 된 문서의 _id 값을 얻기 위해 당신을 줄 것이다 다른 대량 API 방법 upsert()을 사용하는 것이 좋습니다겠습니까. 결과 개체는 BulkWriteResult에 대한 설명과 동일한 형식입니다.

Bulk.find() 조건에 일치하는 문서가없는 경우 삽입을 수행 할 Bulk.find.upsert() 옵션과 함께 업데이트 작업. 업데이트 문서가 _id 필드를 지정하지 않으면 MongoDB는 _id 필드를 추가하므로 BatchWriteResult()에 삽입 된 문서 의 ID를 검색 할 수 있습니다.

또한 대량 삽입 작업을 대기 상태로 만드는 방법은 기본적으로 메모리에 저장되므로 권장되지 않습니다. 드라이버의 default way of limiting the batches of 1000 at a time에 의존하는 것 외에도 대기열과 메모리 자원을 관리하는 데 더 많은 제어를 원할뿐 아니라 16MB 미만의 전체 배치를 원할 것입니다. 이를 수행하는 방법은 데이터 배열의 forEach() 루프를 카운터를 사용하여 배치를 한 번에 1000 개로 제한하는 것입니다.


다음은 upsert 새로 만든 문서에 ID를 반환하지 삽입을 의미 위의 방법

function getInsertedIds(result){ 
    var ids = result.getUpsertedIds(); 
    console.log(ids); // an array of upserted ids 
    return ids; 
} 

db.collection('myCollection',function(err,collection) { 
    var bulk = collection.initializeUnorderedBulkOp(), 
     insertedIds = [], 
     counter = 0; 

    dataArray.forEach(function (data){ 
     bulk.find(data).upsert().updateOne(data); 
     counter++; 

     if (counter % 1000 == 0) { 
      bulk.execute(function(err, result) { 
       insertedIds = getInsertedIds(result); 
       bulk = collection.initializeUnorderedBulkOp(); // reset after execute 
      });  
     } 
    }); 

    // Clean up the remaining operations in the queue which were 
    // cut off in the loop - counter not a round divisor of 1000 
    if (counter % 1000 != 0) { 
     bulk.execute(function(err, result) { 
      insertedIds = insertedIds.concat(getInsertedIds(result)); 
      console.log(insertedIds); 
     }); 
    } 
}); 
+1

을 보여줍니다? - 그렇다면 매우 영리합니다. 나는 그것을 좋아한다! – profesor79

+0

최신 Node.js 드라이버를 사용하는 경우 [**'getInsertedIds()'**] (http://mongodb.github.io/node)를 사용하는'Bulk.insert()'메소드로 가능합니다. -mongodb-native/2.1/api/BulkWriteResult.html # getInsertedIds) 메쏘드를 반환하지만, [** BatchWriteResult' **] (https://mongodb.github.io/node-mongodb-native/api- generated/batchwriteresult.html), 내가 알고있는 해결 방법은'upsert()'방법을 통해 가서 [**'getUpsertedIds()'**] (https://mongodb.github.io/node- mongodb-native/api-generated/batchwriteresult.html # getupsertedids) 메소드를 사용하십시오. 설명을 위해 – chridam

+1

thx! – profesor79