MongoDB bulk.execute()既不解决也不拒绝,并且不返回bulkWriteResult

时间:2019-01-07 14:21:20

标签: node.js mongodb promise mongodb-query

MongoDB版本3.6.7,mongoDB node.js驱动程序版本3.1.10。

具有一个函数,该函数应以批量无序操作向数据库添加一些数据。调用bulk.execute()时,就像手动检查的那样,将数据插入到数据库中,但是不会返回执行时应生成的bulkWriteResult对象。

我们需要在其他函数中使用它来确定插入次数等。因此,当将所讨论的函数链接到其他函数中时,它返回未定义的值,当添加bulk.execute().then(console.log)时,也不会向终端记录任何内容。 / p>

该函数具有3个参数,MongoClient,集合名称和要插入到数据库中的文档,该数据库是一个文档数组。

也曾尝试添加err和结果回调,但是没有运气,也没有任何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()
}

2 个答案:

答案 0 :(得分:0)

这是你的功能

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)
}

如果documents参数为空,即length = 0,则集合批量写入功能将始终失败。看它。 另外,您还需要确保对年,月,代码或字段的索引具有缓慢的执行速度,因为它将在每次执行集合扫描以查找文档时缓慢执行。

请记住, 驱动程序文档是您最好的朋友 http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html

答案 1 :(得分:0)

虽然我们认为这是由docker mongo映像版本不是官方版本或过时版本引起的,但无法解决此问题。甚至mongoDB的人也无法复制此信息或解释在任何情况下诺言都无法在时间表内解决或拒绝功能正在起作用的情况,这仍然是一个谜,我们必须通过基本使用三元处理由承诺错误导致的undefined,而没有真正解决潜在的问题-不是理想或最佳实践,但是在没有其他选择的情况下,这就是我们要做的。

非常感谢大家的帮助和评论,以尝试解决该问题。