【问题标题】:MongoDb duplication eror on insert插入时的 MongoDb 复制错误
【发布时间】: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也是同样的错误,见修改后的代码

标签: node.js mongodb


【解决方案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 的假设是正确的。
猜你喜欢
  • 2013-07-05
  • 2017-10-18
  • 2022-08-16
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多