1
我通過mongo shell腳本在mongodb實例中插入大量測試記錄。爲什麼mongodb更新或插入而不是插入?
我使用批量插入性能db.messages.save(messagesBatch);
然而,蒙戈更新插入或更新數據,而不是將它的!
清潔收集後,我運行200只將一個循環,通過50.我從db.getLastErrorObj()
後4批結束與51(?)的記錄,以下列報告批次:
/* 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);
}
有人可以明白爲什麼這個代碼是upserting而不是插入?我究竟做錯了什麼 ?
注意:當然,我插入的文檔沒有_id
字段。
你可以顯示一些示例消息嗎? – glomad
@ithcy我寧願不要(公司數據),但他們沒有'_id'字段,儘管他們有一堆'xyzID'字段。 – Offirmo
如果文檔包含一個_id字段,保存會做一個upsert。 – Martin