当前位置: 首页 > 知识库问答 >
问题:

node.jsdb.collection.insert一-MongoError: E11000重复密钥错误集合:_id_

夏侯楷
2023-03-14

在node.js,从一个javascript循环,我试图插入一个json对象到一个mongoDB集合,但得到重复的键错误_id列。

{MongoError:E11000重复密钥错误集合:app.Tab2017index:id dup-key:{:ObjectId('5cbc813227b2ca2864b3c66a')}

这是我的javascript代码的一部分,它导致了错误。

const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');
const url = 'mongodb://localhost:27017';
const dbName = 'app';    
var jsonData = {};

  MongoClient.connect(url,{useNewUrlParser: true}, function(err, client) {
    assert.equal(null, err);
    if(err) { return console.dir(err); }
    const db = client.db(dbName);
    const collection = db.collection('Tab2017')

    for (var i = 0; i < 5; i++) {        
            jsonData["test"] = "line";                          
                console.log('LINE_'+i+'- '+JSON.stringify(jsonData));
                collection.insertOne(jsonData, (err, result) => {                       
                    if(err) { console.dir(err); }                           
                    console.log('mongodb insert done');             
                })              
        }     
  })

以上代码在控制台上显示错误,

D:\app\server\routes>node linmon.route-backup3.js
LINE_0- {"test":"line"}
LINE_1- {"test":"line","_id":"5cbc813227b2ca2864b3c66a"}
LINE_2- {"test":"line","_id":"5cbc813227b2ca2864b3c66a"}
LINE_3- {"test":"line","_id":"5cbc813227b2ca2864b3c66a"}
LINE_4- {"test":"line","_id":"5cbc813227b2ca2864b3c66a"}
mongodb insert done
-------------------------------------------
{ MongoError: E11000 duplicate key error collection: app.Tab2017 index: _id_ dup key: { : ObjectId('5cbc813227b2ca2864b3c66a') }
    at Function.create (D:\app\server\node_modules\mongodb\node_modules\mongodb-core\lib\error.js:43:12)
    at toError (D:\app\server\node_modules\mongodb\lib\utils.js:149:22)
    at coll.s.topology.insert (D:\app\server\node_modules\mongodb\lib\operations\collection_ops.js:859:39)
    at D:\app\server\node_modules\mongodb\node_modules\mongodb-core\lib\connection\pool.js:397:18
    at process._tickCallback (internal/process/next_tick.js:61:11)

我没有插入_idcolumns值并允许系统生成它。下面是getindexes的输出。

> db.Tab2017.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "app.Tab2017"
        }
]
>

当我插入相同的对象通过mongo shell命令行,它的工作没有错误。看起来像javascript不等待mongoDB插入操作完成。

共有3个答案

祁绪
2023-03-14

我也有类似的问题。问题是范围(正如上面尼尔·伦在评论中提到的)。

我通过Netlify无服务器函数(Lambda函数)将文档插入到集合中。我没有数据库模式。第一次进入效果很好。所有后续条目均失败。

失败的代码:

const mongodb = require('mongodb')
const MongoClient = mongodb.MongoClient
const myInitialDocument = { title: null }

function createClient (connectionString) {
  const client = new MongoClient(
    connectionString,
    { useNewUrlParser: true, useUnifiedTopology: true }
  )
  return client
}

exports.handler = async function (event) {
  const dbClient = createClient('connection_string_to_db')
  let entryToDb

  try {
    await dbClient.connect()
    entryToDb = await dbClient.db().collection('somecollection').insertOne(myInitialDocument)
  } catch (err) {
    console.log(err)
  }
  dbClient.close()
  return {
    body: JSON.stringify(entryToDb)
  }
}

上面的问题是my初始文档发生了变异,并且在初始调用之后,它包括了_id

已更新的有效代码(没有myInitialDocumentconst):

const mongodb = require('mongodb')
const MongoClient = mongodb.MongoClient

function createClient (connectionString) {
  const client = new MongoClient(
    connectionString,
    { useNewUrlParser: true, useUnifiedTopology: true }
  )
  return client
}

exports.handler = async function (event) {
  const dbClient = createClient('connection_string_to_db')
  let entryToDb

  try {
    await dbClient.connect()
    entryToDb = await dbClient.db().collection('somecollection').insertOne({ title: null })
  } catch (err) {
    console.log(err)
  }
  dbClient.close()
  return {
    body: JSON.stringify(entryToDb)
  }
}
严誉
2023-03-14

在插入之前,只需从对象中删除_id字段。

delete jsonData["_id"];

如果你用猫鼬,试试这个。

jsonData["_id"] = new mongoose.Types.ObjectId();

当然,这将解决您的问题,您可以通过不下降索引来保持唯一性。

车靖琪
2023-03-14

我自己解决了这个问题。Nodejs执行异步操作,因此它完成了循环,但也一直插入到mongodb集合中。我注意到,第一次操作总是成功的,而后续插入总是失败的。mongodb会为第一次插入生成“\u id”值,并在json对象中保留相同的“\u id”。这就是它抛出重复错误的原因。在mongo insert之前,我只添加了一行代码来删除json对象中的“_id”,它就起作用了。

这是我修改过的代码。

for (var i = 0; i < 5; i++) {        
            jsonData["test"] = "line"; 
            **delete jsonData["_id"];**
                console.log('LINE_'+i+'- '+JSON.stringify(jsonData));
                collection.insertOne(jsonData, (err, result) => {                       
                    if(err) { console.dir(err); }                           
                    console.log('mongodb insert done');             
                })              
        } 
 类似资料:
  • 我在一个djs机器人工作,我遇到了一个错误,我不知道如何修复我已经看了https://docs.mongodb.com/manual/indexes/和NodeJs,摩卡和猫鼬,但似乎没有什么帮助这里是信息- 错误发生在这里- 这是我的服务器模型/服务器架构- 最后,这是我得到的错误-

  • 出于某种原因,我的应用程序不允许我创建多个配置文件。下面是服务文件中的设置: //这将查找配置文件(如果存在) //如果一个不存在的话,应该创建一个 它适用于第一个用户,但当我创建另一个用户时,我会得到错误:{“error”:{“message”:“MongoError:E11000重复键错误集合:TownMiner.profiles index:info.subs_1 dup key:{info

  • MongoError:E11000重复密钥错误集合:myFirstDatabase。tours索引:rating_1 dup键:{rating:null} 当我使用postman创建数据时,我不理解这个错误,说dup key:{rating:null},在shcema中没有任何评级键,这是从哪里来的?为什么我只能创作一次。 这是我的代码(tourSchema) 这是我试图添加的数据 }

  • 我试图从我的模式中的数组中删除一个特定的值(一个游戏),这是代码: 模式: 错误: MongoError:E11000重复密钥错误集合:mountain。用户索引:游戏。密码_1 errmsg:'E11000重复密钥错误集合:mountain。用户索引:游戏。密码\u 1 dup密钥:{games.password:null}',[Symbol(mongoErrorContextSymbol)]:

  • 问题内容: 我刚刚开始使用MongoDb,我注意到我有很多重复的记录,这些记录本来就是唯一的。我想知道如何对数据使用组合键,并且正在寻找有关如何创建它们的信息。最后,我使用Java来访问mongo和morphia作为我的ORM层,因此将您的答案中的内容包括在内是非常棒的。 Morphia:http : //code.google.com/p/morphia/ 问题答案: 您也可以将对象用于_id字

  • 问题内容: 我正在尝试将大量用户列表插入MySQL数据库,但是每次尝试都出现错误: 之所以这样,是因为第二列在很多条目上都是空白的,因此在第二列中插入一个空白条目后,就不会再添加另一个了。但是,当我昨天添加了大多数列表时,即使昨天添加的很多条目在第2列中也有一个空白单元格,我也没有一次收到此错误。这是怎么回事? 这是插入1个条目的sql代码。其余的遵循相同的格式: 问题答案: 除了Sabeen的答