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
필드가 없습니다.
몇 가지 샘플 메시지를 표시 할 수 있습니까? – glomad
@ithcy 나는 (회사 데이터) 오히려 안된다. 그러나 그들은'xyzID' 필드를 가지고 있지만'_id' 필드가 없다. – Offirmo
저장시 문서에 _id 필드가 있으면 upsert를 수행합니다. – Martin