当前位置: 首页 > 面试题库 >

批量写入Firebase Cloud Firestore

黄高爽
2023-03-14
问题内容

我想创建一个新集合,并向其中添加成千上万个大小约为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.

我的代码如下

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

}

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

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

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

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

谢谢


问题答案:

您正在为程序顶层的 所有 写入创建一个批处理。batch.set()在所有批量写入操作中,所有调用都可以重用它。

var batch = db.batch();

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

while(lc<=tc) {
    var batch = db.batch();
    // use the new batch here
}


 类似资料:
  • 在本dynamodb文档中,说明了现有项目不能通过批量写入进行更新。但是,当我尝试时,它会替换新项目。我如何防止它更新已经存在的一个?

  • 问题内容: 这是我在阅读有关jpa批量插入的几个主题之后创建的简单示例,我有2个持久对象User和Site。一个用户可以拥有多个站点,因此我们在这里有一对多的关系。假设我要创建用户并将多个站点创建/链接到用户帐户。考虑到我愿意为Site对象使用批量插入,代码如下所示。 但是,当我运行此代码时(我将hibernate方式用作jpa实现提供程序),我看到以下sql输出: 所以,我的意思是“真实的”批量

  • 我正在写一个数据挖掘程序,可以批量插入用户数据。 当前SQL只是一个普通的批量插入: 如果发生冲突,如何进行更新?我试过: 但它抛出

  • dolphindb 目前使用的 是 pool = ddb.DBConnectionPool("0.0.0.0", 8903, 20, "admin", "123456") appender = ddb.PartitionedTableAppender("dfs://dd", "dd", "instrument_id", pool) 多线程 线程池写入 问题是: 批量写入有重复 怎么去除重复呢 写入

  • 问题内容: 哪种nosql系统更适合开箱即用地处理大量插入?最好在1台物理机上运行(允许许多实例)。 有没有人做过基准测试?(谷歌搜索没有帮助) 注意 :我了解选择noSQL数据库取决于需要存储的数据类型(文档:MongoDB,图:Neo4j等)。 问题答案: Apache Cassandra 的独特持久性模型使其在写操作方面表现出色。有人声称它的写入速度比读取速度快20倍,但我认为它确实取决于您

  • 问题内容: 我正在使用Python中的MySQLdb模块与数据库进行交互。我遇到的情况是有一个非常大的列表(成千上万个元素),需要将它们作为行插入表中。 我现在的解决方案是生成一个大的语句作为字符串并执行它。 有没有更聪明的方法? 问题答案: 有一种更聪明的方法。 批量插入的问题在于,默认情况下启用了自动提交功能,从而导致每个语句在下一次插入可以启动之前被保存到稳定存储中。 如手册页所述: 默认情