我们正在使用具有 MongoDB API 支持的 Azure CosmosDB 的特定实例。
我使用一个名为 es6-promise-pool 的库来限制并发(我已将其降低为 1)。
function updateLoglineDB(outArr, brbId, context) {
return new Promise((resolve, reject) => {
let concurrency = 1;
const promiseIterator = generatePromisesLoglines(outArr, brbId, context);
let pool = new PromisePool(promiseIterator, concurrency);
pool.start().then((done) => {
resolve(done);
}).catch((err) => {
reject(err);
});
});
}
这是 generatePromisesLoglines 函数:
const generatePromisesLoglines = function * (outArr, brbId, context) {
for (let entry of outArr) {
yield promiseWrite(entry, brbId, context);
}
};
这是 promiseWrite 函数:
function promiseWrite(entry, brbId, context) {
return new Promise((resolve, reject) => {
let loglineColl = db.get().collection(logLinesCollection);
loglineColl.update({ _id: entry._id }, {$set: entry}, {upsert: true}, function(err, result) {
if (err) {
context.log(brbId, ': ', err);
reject(`logline write rejected with error ${err}, ${brbId}, ${entry}`);
} else {
resolve(`result of update: ${JSON.stringify(result)}`);
}
});
});
}
根据此网页,我一直在寻找批量插入功能,但没有找到任何批量插入或批量更新:Azure Cosmos DB Mongo API support
当我尝试一次插入约 15-20k 文档时,会发生请求率大错误。有没有更好的方法可以编写这个,或者我可以使用某种支持的 MongoDB API 到 Azure CosmosDB 的批量插入?
我创建了一个带有 100,000 RU 分片的测试数据库,我认为它不需要更多,因为每个单独的文档都相对较小。
样本文件:
{
"_id" : "1456026|<filename>|8842",
"signatureGroup" : "<teamName>",
"brbId" : "145602",
"file" : "<filename>",
"lineNumber" : 8842,
"line" : "<sample logline> ~200-300 characters",
"date" : ISODate("2018-05-14T20:15:13.771Z"),
"matchCode" : "<sample matchCode>",
"info" : false
}