Обещание MongoDB bulk.execute () не разрешает и не отклоняет, и не возвращается массив bulkWriteResult. - PullRequest
0 голосов
/ 07 января 2019

MongoDB версии 3.6.7, mongoDB node.js версия драйвера 3.1.10.

Имейте функцию, которая должна добавить некоторые данные в базу данных в массовой неупорядоченной операции. Когда вызывается bulk.execute(), данные вставляются в БД, как было проверено вручную, в этом случае, однако объект bulkWriteResult, который должен быть создан в результате выполнения, не возвращается.

Это необходимо для использования в других функциях для определения количества вставок и т. Д. Поэтому, когда рассматриваемая функция объединена в цепочку с другими функциями, она возвращает неопределенное значение, при добавлении bulk.execute().then(console.log) также ничего не регистрируется в терминале.

Функция принимает 3 параметра: MongoClient, имя коллекции и документы для вставки в БД, представляющую собой массив документов.

Также безуспешно пытались добавить ответные вызовы err и result, ни один из console.logs не достигнут.

batch.execute((err, result) => {
    console.log('RESULT INSERTED:', result.nInserted)
    console.log('RESULT ERRORS:', result.getWriteErrorCount())
    console.log('RESULT INSIGHTS:', result.getWriteErrors())
    console.log('ERROR:', err)
})

Есть идеи, почему bulkWriteResult не будет возвращен, пока массовая вставка прошла успешно? Функция работала и возвращала ожидаемый объект до обновления драйвера узла mongoDB до 3.1.10.

const insertManyMissingEntries = (database, collectionName, documents) => {
  const db = database.db('data')
  const collection = db.collection(collectionName)
  const batch = collection.initializeUnorderedBulkOp()
  documents.forEach(doc => {
    batch
      .find({ year: doc.year, month: doc.month, code: doc.code })
      .upsert()
      .updateOne({ '$setOnInsert': doc })
  })

  return batch.execute()
}

1 Ответ

0 голосов
/ 07 января 2019

Вот ваша функция

const insertManyMissingEntries = (database, collectionName, documents) => {

    if (documents.length === 0)
        return Promise.reject('documents length is zero')

    const operations = documents.map((doc) => {

        const filter = {year: doc.year, month: doc.month, code: doc.code}
        const update = {$setOnInsert: doc}

        return {updateOne: {'filter': filter, 'update': update, 'upsert': true}}
    })

    const db = database.db('data')
    const collection = db.collection(collectionName)

    const bulkOptions = {ordered: false}

    return collection.bulkWrite(operations, bulkOptions)
}

Если параметры документов пустые, т.е. длина = 0, функция массовой записи коллекции всегда завершится ошибкой. Смотреть это Также вам нужно убедиться, что у вас есть индекс для полей год, месяц, код, или ваш объем будет выполняться медленно, потому что он будет каждый раз выполнять сканирование коллекции, чтобы найти документ.

Помните, водитель документы твой лучший друг http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html

...