我已经尝试了几种解决方案以使其正常运行,但都失败了。我正在使用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