Node.js MongoDB:批量上传E11000:重复密钥错误
我通过一个带有远程API的websocket连接接收“订单”数据 对于每次更新,我都会得到一个或多个订单项目的增量 我试图使用批量API将此数据保存到Mongo,但是在使用批量更新/升级时,我遇到了“E11000重复密钥”错误 订单集合的架构如下所示:Node.js MongoDB:批量上传E11000:重复密钥错误,node.js,mongodb,mongodb-query,Node.js,Mongodb,Mongodb Query,我通过一个带有远程API的websocket连接接收“订单”数据 对于每次更新,我都会得到一个或多个订单项目的增量 我试图使用批量API将此数据保存到Mongo,但是在使用批量更新/升级时,我遇到了“E11000重复密钥”错误 订单集合的架构如下所示: var OrderSchema = new Schema({ account: { type: Schema.ObjectId, ref: 'Account', index: true
var OrderSchema = new Schema({
account: {
type: Schema.ObjectId,
ref: 'Account',
index: true
},
orderID: {
type: String,
default: '',
index: {unique: true}
},
clOrdID: {
type: String,
default: '',
index: {unique: true}
},
clOrdLinkID: {
type: String,
default: ''
},
transactTime: {
type: Date,
default: Date.now,
},
timestamp: {
type: Date,
default: Date.now,
index: true
},
});
我正在尝试使用以下代码:
var _BULK = Order.collection.initializeOrderedBulkOp();
query = {
orderID: '1445d4bf-4813-6a75-79c9-b0341b116cde',
account: 56e82fa332fca2200cb0506b
}
// Received as delta from websocket connection.
changes = {
orderID: '1445d4bf-4813-6a75-79c9-b0341b116cde',
clOrdID: '',
clOrdLinkID: '',
account: 56e82fa332fca2200cb0506b,
transactTime: "2016-07-08T21:38:27.269Z",
timestamp: "2016-07-08T21:38:27.269Z"
}
_BULK.find(query).upsert().updateOne({$set: changes});
执行此操作时,我会出现以下错误:
WriteError({
"code":11000,
"index":0,
"errmsg":"E11000 duplicate key error index: testdb.orders.$orderID_1 dup key: { : \"1445d4bf-4813-6a75-79c9-b0341b116cde\" }",
"op":{
"q":{
"orderID":"1445d4bf-4813-6a75-79c9-b0341b116cde",
"account":"56e82fa332fca2200cb0506b"
},
"u":{
"$set":{
"orderID":"1445d4bf-4813-6a75-79c9-b0341b116cde",
"clOrdID":"",
"clOrdLinkID":"",
"account":"56e82fa332fca2200cb0506b",
"transactTime":"2016-07-08T21:38:27.269Z",
"timestamp":"2016-07-08T21:38:27.269Z"
}
},
"multi":false,
"upsert":true
}
})
在我看来,这表明集合中已经有一个订单具有匹配的“orderID”,但事实并非如此
db.orders.find({orderID:"1445d4bf-4813-6a75-79c9-b0341b116cde"});
// or
db.orders.find({"orderID":"1445d4bf-4813-6a75-79c9-b0341b116cde"});
我没有得到任何结果
1)如果存在重复的“orderID”,此操作不只是对项目进行更新吗?
2)如果不存在重复的“orderID”(看起来不存在),为什么会抛出“E11000重复密钥错误”?
我尝试过有序和无序批量操作
更新
我还尝试使用“$setOnInsert”设置“orderID”属性
_BULK.find(query).upsert().updateOne({$set: changes, $setOnInsert: onInsert});
这会引发相同的重复密钥错误。但是,批量对象的当前批处理如下所示:
_BULK.s.currentBatch: {
originalZeroIndex: 0,
currentIndex: 0,
originalIndexes: [ 0 ],
batchType: 2,
operations: [
{
q: {
orderID: '1445d4bf-4813-6a75-79c9-b0341b116cde',
account: 56e82fa332fca2200cb0506b
},
u: {
'$set': {
clOrdID: '',
clOrdLinkID: '',
account: 56e82fa332fca2200cb0506b,
transactTime: Fri Jul 08 2016 16:38:27 GMT-0500 (Central Daylight Time),
timestamp: Fri Jul 08 2016 16:38:27 GMT-0500 (Central Daylight Time)
},
'$setOnInsert': {
orderID: '1445d4bf-4813-6a75-79c9-b0341b116cde'
}
},
multi: false,
upsert: true
}
],
size: 0,
sizeBytes: 0
}
我猜orderID不能设置为相同的值,因为您说它应该是唯一的。因此,您正在将orderID设置为已设置的orderID。为什么不直接从$set中的数据中删除orderID?在upsert的情况下,仍然需要设置此字段定义?可能是这样