MongoDB:Bulk Upsert Throwing E11000:重复键错误

时间:2016-07-08 22:54:46

标签: node.js mongodb mongodb-query

我收到"订单"数据通过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 
    }

0 个答案:

没有答案