Node.js MongoDB:批量上传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

我通过一个带有远程API的websocket连接接收“订单”数据

对于每次更新,我都会得到一个或多个订单项目的增量

我试图使用批量API将此数据保存到Mongo,但是在使用批量更新/升级时,我遇到了“E11000重复密钥”错误

订单集合的架构如下所示:

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的情况下,仍然需要设置此字段定义?可能是这样