Bulk никогда не возвращает ошибку при установке параметров как {j: false}

Отредактировано: в вопрос добавлена ​​новая информация

При использовании массовой операции с опцией ведения журнала 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

person efkan    schedule 27.10.2017    source источник
comment
Это действительно возвращает ошибку. Просто вы не сериализуете его правильно 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.2017
comment
На самом деле дубликат Как я могу отобразить объект JavaScript? но я изначально помечен как дубликат чего-то еще и слишком поспешно удалил флаг дубликата, прежде чем понял, что на самом деле это дубликат этого.   -  person Neil Lunn    schedule 28.10.2017
comment
К вашему сведению. Первоначально это выглядело как собственный драйвер MongoDB Node.js молча проглатывает bulkWrite исключение, но, как отмечено там на этом уровне ОБА (err, result) на самом деле содержат подробные сведения об ошибке, НО это изменится в следующей версии драйвера. В будущем result будет пустым, и только err будет содержать более информативный BulkWriteError.   -  person Neil Lunn    schedule 28.10.2017
comment
@NeilLunn большое спасибо за информацию о result будет пусто в следующем драйвере. Я не знал. Так что я должен измениться прямо сейчас, если смогу ..   -  person efkan    schedule 28.10.2017
comment
@NeilLunn, для вас убедитесь, что я могу сказать, что он никогда не возвращает E11000 ошибок при установке параметров как { j:false }, а также я могу получить повторяющуюся ошибку, если я изменю настройку как { j:true }. Однако в официальных документах мне не удалось найти никакой информации по этому поводу. Может, я проглядел. Кроме того, stringify не требуется, потому что каждый объект WriteError имеет метод toString() для сериализации ошибки от нашего имени;)   -  person efkan    schedule 28.10.2017
comment
Ваш код будет в порядке, если вы специально ищете соответствующую информацию как в ошибке, так и в результате. Естественно искать BulkWriteResult там, где оно есть, и где null ожидают BulkWriteError, в отличие от MongoError, которое возвращается сейчас. Если вы думаете, что по-прежнему требуете, что ничего не возвращается, тогда это действительно так, как я объясняю. Я знаю это, потому что проверил это. А еще это юнит-тест драйвера AFAIK. Единственный способ не получить ответа - это полностью выключить функцию записи, в режиме «активировал и забыл». И это задумано.   -  person Neil Lunn    schedule 28.10.2017
comment
Я понял, что это моя вина. Я использую Mongoose, я должен был это указать. С другой стороны, Mongoose у меня использует последнюю версию драйвера. Я отредактирую вопрос через некоторое время после того, как ...   -  person efkan    schedule 28.10.2017
comment
@NeilLunn, ты правильно помнишь. Я нашел это. Есть тест. чтобы проверить код ошибки 11000. Но его конфигурация базы данных была установлена ​​как {w:1}. Тем не менее я сообщил об этом. Думаю, мы узнаем, что это ...   -  person efkan    schedule 28.10.2017