我收到"订单"数据通过websocket连接与一些远程API。
对于每次更新,我都会获得一个或多个订单商品的增量。
我正在尝试使用BULK API将此数据保存到Mongo,但是我得到了一个" E11000重复键"使用BULK更新/ upsert时出错。
Order集合的架构如下所示:
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
}