插入时的 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 复制错误的主要内容,如果未能解决你的问题,请参考以下文章

更新/插入子文档时的 mongodb 性能

使用php时的mongodb错误[重复]

使用 Laravel 播种 MongoDB 时的 authenticationDatabase 错误

错误:使用 mongoose 连接到 MongoDb Atlas 时的 queryTxt ETIMEOUT

mongodb启动服务时候报错。错误1067,进程意外终止。

MongoDB 错误:通过 JSON 文件以 ISO 格式将日期插入 MongoDB