当前位置: 首页 > 知识库问答 >
问题:

Firestore能否使用一个查询更新多个符合条件的文档?

罗烨霖
2023-03-14

换言之,我试图找出Firestore在SQL中与此等效的是什么:

UPDATE table SET field = 'foo' WHERE <condition>`

是的,我问的是如何一次更新多个文档,但与链接的问题不同,我特别问的是如何一次更新多个文档,而不将任何内容读入内存,因为当您只想在所有匹配条件的文档上设置一个标志时,不需要这样做。

db.collection('table')
  .where(...condition...)
  .update({
    field: 'foo',
  });

这就是我期望的工作方式,集合参考没有. update方法。

Transactions and Batched Writes文档提到了事务和批处理写入。事务被淘汰是因为“一个事务由任意数量的get()操作和任意数量的写入操作组成”批处理写入也不是解决方案,因为它们可以逐个文档工作。

对于MongoDB,这将是

db.table.update(
  { /* where clause */ },
  { $set: { field: 'foo' } }
)

那么,Firestore是否可以像SQL数据库或MongoDB那样使用一个查询更新多个文档,即不需要为每个文档往返客户端?如果没有,如何有效地做到这一点?

共有3个答案

沈鸿光
2023-03-14

最简单的方法是这样

const ORDER_ITEMS = firebase.firestore().collection('OrderItems')

ORDER_ITEMS.where('order', '==', 2)
  .get()
  .then(snapshots => {
    if (snapshots.size > 0) {
      snapshots.forEach(orderItem => {
        ORDER_ITEMS.doc(orderItem.id).update({ status: 1 })
      })
    }
  })
岑炯
2023-03-14

弗兰克的回答实际上很好,确实解决了这个问题。

但对于那些匆匆忙忙的人来说,这段话可能会对你有所帮助:

const updateAllFromCollection = async (collectionName) => {
    const firebase = require('firebase-admin')

    const collection = firebase.firestore().collection(collectionName)

    const newDocumentBody = {
        message: 'hello world'
    }

    collection.where('message', '==', 'goodbye world').get().then(response => {
        let batch = firebase.firestore().batch()
        response.docs.forEach((doc) => {
            const docRef = firebase.firestore().collection(collectionName).doc(doc.id)
            batch.update(docRef, newDocumentBody)
        })
        batch.commit().then(() => {
            console.log(`updated all documents inside ${collectionName}`)
        })
    })
}

只需更改查询数据的where函数和newDocumentbody中的内容,这是每个文档都要更改的内容。

也不要忘记用集合的名称调用函数。

师成弘
2023-03-14

在Cloud Firestore中更新文档需要知道其ID。Cloud Firestore不支持与SQL的更新查询等效的查询。

您将始终必须分两个步骤执行此操作:

  1. 使用您的条件运行查询以确定文档ID

请注意,您只需要步骤1中的文档ID。因此,您可以运行只返回ID的查询。这在客户端SDK中是不可能的,但可以通过REST API和管理SDK完成,如下所示:如何在集合云Firestore中获取文档ID列表?

 类似资料:
  • 问题内容: 我在这里找到了一些可以更新一个字段的东西:http : //www.karlrixon.co.uk/articles/sql/update-multiple-rows-with-different- values-and-a-single-sql- query/ 我的问题是如何更新多个字段?如: 这当然是行不通的。尝试了其他几种组合并失败了。任何的想法?谢谢! 问题答案:

  • 在Firestore中,我有一个用户集合,在每个用户文档中存储一个名为favorites的集合,该集合包含标记为favorites(存储)的文档的ID 我可以采取另一种方法来获取两个集合并手动过滤它们,但我使用的是Firebase RecycerView适配器,它显示的所有数据都基于查询,这将使事情更加高效。 这样的结果是如何实现的呢?如果需要进一步的解释,请告诉我

  • 问题内容: 我正在尝试使用操作数AND一起查询集合。我有外壳版本工作: 我找不到Java等效项(使用本机驱动程序)。我已经尝试了各种方法,但这是我最近的尝试: 任何想法有什么问题吗? 问题答案:

  • 我尝试通过实现以下函数,使用单个查询更新多行(约 350000): 尝试运行上述函数时,仅更新了 31 条记录。然后,我尝试使用以下函数逐行更新: 后者迄今已更新了所有记录,但速度很慢(估计将在9小时内结束)。有人知道更新多个记录的有效方法吗?

  • 本文向大家介绍MongoDB中一次查询更新多个文档,包括了MongoDB中一次查询更新多个文档的使用技巧和注意事项,需要的朋友参考一下 要通过单个查询更新许多文档,请在MongoDB中使用 bulkWrite()。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是使用MongoDB中的一个查询来更新许多文档的查询- 在find()方法的帮助

  • 我在Cloud Firestore中有以下简化的数据模式: 我现在想向用户展示他团队的所有“待办事项”文档,我不知道什么是最好的方法。 1. 集合组查询 - 按团队 ID 查询 为此需要两个查询。每个待办事项文档都可以具有父团队 ID,并通过集合组查询进行检索,例如 - 到目前为止,这对我来说似乎是最好的解决方案,但缺点是“IN”查询限制为10个值 https://firebase.googleb