为什么mongodb更新或upserting而不是插入?

时间:2013-10-30 17:43:08

标签: mongodb upsert

我通过mongo shell脚本在mongodb实例中插入了大量测试记录。

我使用批量插入来实现性能db.messages.save(messagesBatch);

然而,mongo upsert或更新我的数据而不是插入它!

清理完集合后,我通过50批次运行200个插入循环。我在4批次之后得到51(??)记录,其中包含来自db.getLastErrorObj()的以下报告:

/* 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
}

我的插入代码如下:

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字段。

1 个答案:

答案 0 :(得分:0)

它似乎来自于使用messagesBatch.length = 0;技术清空数组以准备下一批。相反,通过使用messagesBatch = [];创建一个新数组来“重置”(排序),它可以按预期工作。

我想插入是异步的,直接在数组ref上工作,似乎等待getLastErrorObj()不足以确保所有数据都已写入。这似乎不对。

空的第51条记录来自剧本结尾处一个空的阵列的一个糟糕的系统“安全”冲洗,与问题无关。