Mongodb массовая вставка упорядоченного поведения - PullRequest
0 голосов
/ 17 мая 2018

У меня есть приложение (в Scala, хотя этот вопрос, вероятно, не зависит от драйвера), которое разбивает вставки тысячами, а затем выполняет массовую вставку.Из-за способа получения и обработки данных возможно, что у нас могут быть дубликаты идентификаторов, мы просто хотим их игнорировать.

В соответствии с документацией для массовой записи https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/#bulkwrite-example-unordered-bulk-write, с использованием ordered: falseопция должна позволять запускать все вставки без сбоя всей записи из-за ошибки.

Поскольку это была неупорядоченная операция, записи, оставшиеся в очереди, были обработаны, несмотря на исключение.

Однако в моем журнале ошибок появляются ошибки, подобные этой

Команда I COMMAND [conn696515] db.Matches: insert {insert: "Matches", упорядочено: false, documents:1000} вставлено: 4 вставлено ключей: 52 исключение: E11000 Коллекция ошибок дублированного ключа: db.Matches index: _id_ dup ключ: {: "3000758-3000343-3845342998431744-5-1646 ----- 10-1"} код: 11000numYields: 0 reslen: 183245 блокировки: {Global: {acquCount: {r: 1017, w: 1017}}, База данных: {acquCount: {w: 1017}}, Коллекция: {acquCount: {w: 1013}}, Метадаta: {acquCount: {w: 4}}, oplog: {acquCount: {w: 4}}} протокол: op_query 1003ms

Что говорит мне о том, что из моих 1000 фактически было вставлено только 4.

Это значит?

  1. 996 моих вкладок были дубликатами (это очень маловероятно)?
  2. Опция ordered:false не позволяет вставкампродолжить?
  3. Документация буквально означает одинарную, так как при одной записи происходит сбой, а затем при второй ошибке происходит ошибка?
  4. Я неправильно читаю вывод журнала и на самом деле получаювсе эти записи?
  5. Выше работает только на монго?Я использую mongod

EDIT Вот код, который выполняет запрос (обратите внимание, насколько я могу сказать, что это драйвер, который пакетирует его, мы отправляем 10000 с этим методом)

def insertMatchesIgnoreDuplicates(
  matches: HashMap[BsonString,Document],
  database: MongoDatabase
) : Future[_] = {
  val matchesCollection: MongoCollection[Document] = 
  database.getCollection("Matches")
  val inserts = matches.values.map(doc => {
    new InsertOneModel(doc)
  })
  val bulkWriteOptions = new BulkWriteOptions()
  bulkWriteOptions.ordered(false)
  matchesCollection.bulkWrite(inserts.toSeq, bulkWriteOptions).toFuture
}

И при перехвате вывода здесь успешно

AcknowledgedBulkWriteResult {insertCount = 15107, MatchedCount = 0, УдаленныйCount = 0, ModifiedCount = 0, Upserts = []}

и неудачно

com.mongodb.MongoBulkWriteException: ошибка операции массовой записи на сервере 10.131.58.143:27017.Ошибки записи: [BulkWriteError {index = 52621, code = 11000, message = 'E11000 Коллекция дубликатов ошибок ключа: betbrain_v1.Matches index: id dup key: {: "3000177-3000012-3858875929331712-5---2,5 --- 14-1 "} ', подробности = {}}].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...