如何在Mongoose cursor.eachAsync中批量插入?

时间:2018-10-01 14:24:19

标签: node.js mongodb mongoose

我已经尝试了几种解决方案以使其正常运行,但都失败了。我正在使用cursor.eachAsync()阅读Mongo DB文档,并转换了一些文档字段。转换后,我需要将这些文档移到另一个集合中。我的想法是,在处理1000个文档之后,应将它们批量插入到目标集合中。直到最后一批记录少于1000个为止,此方法都有效。用不同的措辞来表达相同的问题,如果记录数小于<1000,则不会插入它们。

1。第一个版本-在async()之后批量插入

就像其他任何代码一样,在async()之后,散装对象中的文档数应小于1000,并且应该能够插入。但是我发现bulk.length为0。(我在下面的代码片段中删除了这些语句)。

```js`async function run(){

await mongoose.connect(dbPath, dbOptions);
const cursor = events.streamEvents(query, 10);
let successCounter = 0;
let bulkBatchSize = 1000;
let bulkSizeCounter = 0;
let sourceDocsCount = 80;
var bulk = eventsConvertedModel.collection.initializeOrderedBulkOp();
await cursor.eachAsync((doc) => {
    let pPan = new Promise((resolve, reject) => {
        getTokenSwap(doc.panTokenIdentifier, doc._id)
            .then((swap) => {
                resolve(swap);
            });                
    });

    let pXml = new Promise((resolve, reject) => {
        let xmlObject;
        getXmlObject(doc)
            .then(getXmlObjectToken)
                    .then((newXmlString) => { 
                        resolve(newXmlString);
                    })
                    .catch(errFromPromise1 => {
                    });
            })
            .catch(error => {
                reject(error);
            });
    });

    Promise.all([pPan, pXml])
        .then(([panSwap, xml]) => {
            doc.panTokenIdentifier = panSwap;
            doc.eventRecordTokenText = xml;
            return doc;
        })
        .then((newDoc) => {
            successCounter++;
            bulkSizeCounter++;
            bulk.insert(newDoc);
            if (bulkSizeCounter % bulkBatchSize == 0) {
                bulk.execute()
                    .then(result => {
                        bulkSizeCounter = 0;
                        let msg = "Conversion- bulk insert =" + result.nInserted;
                        console.log(msg);
                        bulk = eventsConvertedModel.collection.initializeOrderedBulkOp();
                        Promise.resolve();
                    })
                    .catch(bulkErr => {
                        logger.error(bulkErr);
                    });
            }
            else {
                Promise.resolve();
            }
        })
        .catch(err => {
            console.log(err);
        });
});
console.log("outside-async=" + bulk.length); // always 0
console.log("run()- Docs converted in this run =" + successCounter);
process.exit(0);

}`

2。第二版(跟踪预期的迭代次数,并在所有迭代之后,将批量大小更改为10)。 结果-批次大小值更改,但未反映在bulk.insert中。记录丢失了。

3。与第2个相同,但在批量插入后一次插入一个记录

```js

let d = eventsConvertedModel(newDoc);
d.isNew = true;
d._id = mongoose.Types.ObjectId();
d.save().then(saved => {
   console.log(saved._id)
   Promise.resolve();
  }).catch(saveFailed => {
     console.log(saveFailed);
     Promise.resolve();
 });

```

结果-我遇到了DocumentNotFound错误,因此我添加了d.isNew = true。但是由于某种原因,只有很少的记录被插入,而许多记录却丢失了。

我还使用预期的批量插入迭代次数尝试了其他变体。最后,我将代码更改为写入文件(一次写入一个文档),但是我仍然想知道是否有任何方法可以写入数据库。

依赖项: 节点v8.0.0 猫鼬5.2.2

0 个答案:

没有答案