批量写入Firebase Cloud Firestore

kau*_*nde 5 node.js firebase google-cloud-firestore

我想创建一个新集合,并向其中添加成千上万个大小约为1-2K的文档。我已经在json中保存了数据,所以我认为这很容易。

我知道该批处理一次可以写入500次,因此为了将其分成500个,我编写了以下代码。虽然出于测试目的,我以20个块运行它,而我的测试json有72个对象。

但我不断收到以下错误

node_modules\@google-cloud\firestore\src\write-batch.js:148
  throw new Error('Cannot modify a WriteBatch that has been committed.');
  ^

Error: Cannot modify a WriteBatch that has been committed.
Run Code Online (Sandbox Code Playgroud)

我的代码如下

var dataObj = JSON.parse(fs.readFileSync('./bigt.json'))
var tmpdd = dataObj.slice(0, 72)
var batch = db.batch();

console.log(tmpdd.length)

let tc = tmpdd.length
let lc = 0
let upperLimit = 20, dd = null

while(lc<=tc){

    dd = tmpdd.slice(lc, upperLimit )

    console.log(lc, upperLimit)
    dd.map(
    o => batch.set(db.collection('nseStocks').doc(o.Date+o.variable), o)
    )

    batch.commit().then(function () {
        console.log('Written to firestore', lc, lc + upperLimit)
    })
    .catch(
        (err) => console.log('Fail', err)
    )

    lc = upperLimit
    upperLimit = upperLimit + 20 

}
Run Code Online (Sandbox Code Playgroud)

同样奇怪的是,似乎没有在每次循环中都提交批处理。理想情况下,我会让Firestore确定文档ID,但显然批处理没有添加功能。

我尝试过以循环方式添加文档,而不是批量写入。但是在添加一些文档后,它给了我超时错误。当然,对于大量文档来说,这是不切实际的。

您可以说我对Firestore还是很陌生,这是我玩第二天。

请告诉我是否有任何明显的错误或更好的方法来完成此看似简单的任务。

谢谢

Dou*_*son 7

您正在为程序顶层的所有写入创建一个批处理。它被重用于batch.set()您为所有批量写入所做的所有调用。

var batch = db.batch();
Run Code Online (Sandbox Code Playgroud)

相反,您应该为每组写入创建一个新批次。您可以在 while 循环的顶部执行此操作:

while(lc<=tc) {
    var batch = db.batch();
    // use the new batch here
}
Run Code Online (Sandbox Code Playgroud)