2013-10-30 2 views
1

mongob 셸 스크립트를 통해 mongodb 인스턴스에 많은 테스트 레코드를 삽입하고 있습니다.왜 mongodb가 삽입하는 대신에 업데이트 또는 업서 링합니까?

내가 성능을 일괄 삽입을 사용 db.messages.save(messagesBatch);

그러나, upsert 몽고하거나 삽입하는 대신 내 데이터를 업데이트!

/* 0 */ 
{ 
"n" : 0, 
"connectionId" : 166, 
"err" : null, 
"ok" : 1 
} 

/* 1 */ 
{ 
"updatedExisting" : false, 
"upserted" : ObjectId("527141c72a1ae75210d3a705"), 
"n" : 1, 
"connectionId" : 166, 
"err" : null, 
"ok" : 1 
} 

/* 2 */ 
{ 
"updatedExisting" : true, 
"n" : 1, 
"connectionId" : 166, 
"err" : null, 
"ok" : 1 
} 

/* 3 */ 
{ 
"updatedExisting" : true, 
"n" : 1, 
"connectionId" : 166, 
"err" : null, 
"ok" : 1 
} 
:

컬렉션을 청소 한 후, 나는 db.getLastErrorObj()에서 다음과 같은 보고서, 4 개 배치 후 51 (??) 레코드와 끝까지 (50)의 배치를 통해, 200 개 삽입에 대한 루프를 실행

내 삽입 코드는 다음과 같습니다 :이 코드는 upserting 대신 삽입하는 이유

var batchLimit = 50; 
var messagesBatch = []; 

function flushMessages() { 
print("* flushing... (" + messagesBatch.length + ")"); 
var inserted = false; // so far 
do { 
    db.messages.save(messagesBatch); 
    var errObj = db.getLastErrorObj(); 
    print(errObj); 
    if(errObj.ok && errObj.err === null) { 
     // no error, fine 
     inserted = true; 
     messagesBatch.length = 0; 
     print("* flushed. (" + messagesBatch.length + ")"); 
    } 
    else { 
     // insertion error ! 
     failedInsertions++; 
     print(errObj); 
    } 
} while(!inserted); 
} 

function addMessage(message) { 
messagesBatch.push(message); 
if(messagesBatch.length >= batchLimit) { 
    flushMessages(); 
} 
msgGenerated++; 
if(msgGenerated % 100000 == 0) 
    print("* " + msgGenerated); 
} 

사람이 볼 수 있을까요? 내가 도대체 ​​뭘 잘못하고있는 겁니까 ?

참고 : 물론 내가 삽입하는 문서에는 _id 필드가 없습니다.

+0

몇 가지 샘플 메시지를 표시 할 수 있습니까? – glomad

+0

@ithcy 나는 (회사 데이터) 오히려 안된다. 그러나 그들은'xyzID' 필드를 가지고 있지만'_id' 필드가 없다. – Offirmo

+0

저장시 문서에 _id 필드가 있으면 upsert를 수행합니다. – Martin

답변

0

다음 배치를 준비하기 위해 어레이를 비우는 데 messagesBatch.length = 0; 기술을 사용하는 것 같습니다. messagesBatch = [];으로 새 배열을 만들어 "리셋"(일종의) 대신 예상대로 작동합니다.

나는 삽입은 비동기하고) (getLastErrorObj 기다리는 모든 데이터가 기록되어 있는지 확인하는 것만으로는 충분하지 않습니다 것 같다, 배열 심판에 직접 작동 같아요. 이것은 틀린 것처럼 보인다.

비어있는 51 번째 레코드는 스크립트의 끝에 빈 배열이 체계적으로 "안전하지 않은"상태에서 벗어난 것으로서 문제와 관련이 없습니다.

관련 문제