插入时的 MongoDb 复制错误
Posted
技术标签:
【中文标题】插入时的 MongoDb 复制错误【英文标题】:MongoDb duplication eror on insert 【发布时间】:2018-12-07 03:30:05 【问题描述】:我在 mongod db 集合中插入文档
每次 triggerdate 和 event 都会发生变化,但是如果以任何时间间隔连续插入它们,我们就会得到 mongo 重复错误。
但如果我们在时间过去的情况下进行插入,它就会被插入。
var MongoClient = require('mongodb').MongoClient;
var msgObj =
"event" : "Password expired",
"assignee" : "Test",
"triggerDate" : "06/21/2018 18:44:27",
var url ="mongodb://127.0.0.1:27017/org_democustomer"
for( var i=0; i<300;i++)
MongoClient.connect(url, function (err, db)
var connection = db;
var collection = db.collection('events');
// Insert all customer's tickets into document
collection.insert(msgObj, function (err, result)
if (err) throw err;
connection.close();
);
);
那么,如何创建 ObjectId? 它是基于时间的吗? 错误是
MongoError: E11000 重复键错误集合: org_mssdemocustomer.testalerts 索引:id 复制键:: ObjectId('507f191e810c19729de860ea') 在 Function.MongoError.create (/Users/zessta/Desktop/MSSP/MSSPBackend/msp-backend/siem/node_modules/mongodb-core/lib/error.js:31:11) 在 toError (/Users/zessta/Desktop/MSSP/MSSPBackend/msp-backend/siem/node_modules/mongodb/lib/utils.js:139:22) 在 /Users/zessta/Desktop/MSSP/MSSPBackend/msp-backend/siem/node_modules/mongodb/lib/collection.js:668:23 在handleCallback (/Users/zessta/Desktop/MSSP/MSSPBackend/msp-backend/siem/node_modules/mongodb/lib/utils.js:120:56) 在 resultHandler (/Users/zessta/Desktop/MSSP/MSSPBackend/msp-backend/siem/node_modules/mongodb/lib/bulk/ordered.js:421:14) 在 /Users/zessta/Desktop/MSSP/MSSPBackend/msp-backend/siem/node_modules/mongodb-core/lib/connection/pool.js:469:18 在 _combinedTickCallback (内部/进程/next_tick.js:73:7) 在 process._tickCallback (internal/process/next_tick.js:104:9)
如何为立即插入生成唯一 ID
【问题讨论】:
在您的代码中,您将 ObjectId 硬编码为固定字符串,因此您当然会得到重复项。你能发布正确的代码吗?如果这是您正在运行的代码,只需删除字符串并让 ObjectId 自己计算一个 id! 为什么需要自己创建ObjectId? Mongo 客户端可以为您完成。 如果需要,您可以ObjectID();
生成一个。 implementation here
没有对象ID也是同样的错误,见修改后的代码
【参考方案1】:
ObjectId 值。 12 字节的 ObjectId 值包括:
4 字节值,表示自 Unix 纪元以来的秒数, 3 字节机器标识符, 2 字节进程 ID,以及 3字节计数器,以随机值开始。这是您运行良好的代码。
var MongoClient = require('mongodb').MongoClient;
var ObjectID = require('mongodb').ObjectID
var msgObj =
"event": "Password expired",
"assignee": "Test",
"triggerDate": "06/21/2018 18:44:27"
var url = "mongodb://127.0.0.1:27017"
MongoClient.connect(url, function(err, db)
if (err)
console.log(err);
for (var i = 0; i < 300; i++)
//var connection = db;
//var collection = db.collection('events');
var dbo = db.db("org_democustomer1");
// Insert all customer's tickets into document
msgObj._id = new ObjectID();
dbo.collection("events").insert(msgObj, function(err, result)
if (err) throw err;
);
db.close();
);
【讨论】:
删除您的收藏并再次运行脚本。 它是相同的,可能是基于对象 id 创建的时间戳,所以它给出相同的 id,如果尝试插入 我做了一些改动。现在工作正常。参考代码。 酷。您对相同 ObjectID 的假设是正确的。以上是关于插入时的 MongoDb 复制错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 Laravel 播种 MongoDB 时的 authenticationDatabase 错误
错误:使用 mongoose 连接到 MongoDb Atlas 时的 queryTxt ETIMEOUT