在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插入操作完成。
我也有类似的问题。问题是范围(正如上面尼尔·伦在评论中提到的)。
我通过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
。
已更新的有效代码(没有myInitialDocument
const):
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)
}
}
在插入之前,只需从对象中删除_id字段。
delete jsonData["_id"];
如果你用猫鼬,试试这个。
jsonData["_id"] = new mongoose.Types.ObjectId();
当然,这将解决您的问题,您可以通过不下降索引来保持唯一性。
我自己解决了这个问题。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的答