Отредактировано: в вопрос добавлена новая информация
При использовании массовой операции с опцией ведения журнала false она не возвращает code: 11000
ошибку дублирования ключа.
При использовании следующих параметров он не возвращает ошибки:
{ j:false }
{ w:0, j:false }
При использовании следующих параметров он возвращает duplicate key
ошибки:
{ w:"majority", j:false }
{ w:0, j:true }
{ w:"majority", j:true }
Интересно, это правильное поведение?
Например, код:
var ObjectId = mongoose.Types.ObjectId,
User = require('./models/user')
let bulk = User.collection.initializeUnorderedBulkOp()
let doc1 = {
"branch" : "DUPLICATE",
"department" : ObjectId("582bf1d8322809041e667777"),
}
let doc2 = {
"branch" : "TEST_SUCCESS",
"department" : ObjectId("582bf1d8322809041e668888"),
}
let doc3 = {
"branch" : "DUPLICATE",
"department" : ObjectId("582bf1d8322809041e669999"),
}
bulk.insert(doc1)
bulk.insert(doc2)
bulk.insert(doc3)
let bulkOptions = {
w:0,
j:false // next run change argument j as true
}
bulk.execute(bulkOptions, (err, result) => {
let writeErrors = result.toJSON().writeErrors
for (let i = 0; i > writeErrors.length - 1; i++) {
let error = writeErrors[i]
debug(error.toString())
}
})
Кроме того, схема модели User имеет уникальный составной индекс userSchema.index({ branch:1, department:1 }, { unique: true })
Версия приложения
mongoDB v3.4.3 (storageEngine is wiredTiger)
mongoose v4.12.4 (the documentation refers to node-mongodb-native API 2.2)
node.js v8.8.1
console.log("result: \n%s", JSON.stringify(result,undefined,2))
. Ответ содержитwriteErrors
, который представляет собой массив классифицированных объектов типаwriteError
. Ваш код должен показывать вам[ WriteError { code: [Getter], ... toJSON: [Function],oString: [Function] } ]
Это означает, что вы просто выполняете глубокую сериализацию, как показано.console.log()
сам по себе этого не делает. Вот почему выJSON.stringify
все, что отличается от вызова.toJSON()
для объекта верхнего уровня. - person Neil Lunn   schedule 28.10.2017bulkWrite
исключение, но, как отмечено там на этом уровне ОБА(err, result)
на самом деле содержат подробные сведения об ошибке, НО это изменится в следующей версии драйвера. В будущемresult
будет пустым, и толькоerr
будет содержать более информативныйBulkWriteError
. - person Neil Lunn   schedule 28.10.2017result
будет пусто в следующем драйвере. Я не знал. Так что я должен измениться прямо сейчас, если смогу .. - person efkan   schedule 28.10.2017E11000
ошибок при установке параметров как{ j:false }
, а также я могу получить повторяющуюся ошибку, если я изменю настройку как{ j:true }
. Однако в официальных документах мне не удалось найти никакой информации по этому поводу. Может, я проглядел. Кроме того,stringify
не требуется, потому что каждый объектWriteError
имеет методtoString()
для сериализации ошибки от нашего имени;) - person efkan   schedule 28.10.2017BulkWriteResult
там, где оно есть, и гдеnull
ожидаютBulkWriteError
, в отличие отMongoError
, которое возвращается сейчас. Если вы думаете, что по-прежнему требуете, что ничего не возвращается, тогда это действительно так, как я объясняю. Я знаю это, потому что проверил это. А еще это юнит-тест драйвера AFAIK. Единственный способ не получить ответа - это полностью выключить функцию записи, в режиме «активировал и забыл». И это задумано. - person Neil Lunn   schedule 28.10.201711000
. Но его конфигурация базы данных была установлена как{w:1}
. Тем не менее я сообщил об этом. Думаю, мы узнаем, что это ... - person efkan   schedule 28.10.2017