【问题标题】:How to increment a map value in a Firestore array如何增加 Firestore 数组中的地图值
【发布时间】:2020-02-06 23:19:08
【问题描述】:

我有一个 firestore firebase 数据库,其中我有一个集合 users 集合中有一个数组,数组中有一个映射 在地图中有一个字段 qty.. 我想增加那个 qty 值..

使用增量没有帮助,因为数量在数组索引内

    db.collection("users").doc(checkId).update({
                myCart: firebase.firestore.FieldValue.arrayUnion({
                    qty: firebase.firestore.FieldValue.increment(1),

                }),

这是错误输出 => 未捕获(承诺中)FirebaseError:使用无效数据调用的函数 FieldValue.arrayUnion()。 FieldValue.increment() 只能与 update() 和 set() 一起使用

【问题讨论】:

    标签: javascript google-cloud-firestore


    【解决方案1】:

    您要更新的字段嵌入在一个数组中。在这种情况下,您不能使用FieldValue.increment(),因为无法将数组元素调用为命名字段值。

    您必须做的是读取整个文档,修改内存中的字段以包含您想要的内容,然后将该字段更新回文档中。如果您需要更新为原子,还可以考虑为此使用事务。

    (如果该字段不是数组的一部分,您可以使用FieldValue.incrememnt()。)

    【讨论】:

    • 好的,明白了,谢谢
    • 使用点符号,如下面的 Coder Marine 给出的答案所示。更容易
    【解决方案2】:

    鉴于qty 在数组中,我的回答无效。更新数组中的项的唯一方法是读取整个文档,更新数组中的项,然后将包含更新项的整个数组写回文档。


    另一种方法是使用 ma​​p 而不是数组,然后使用下面我的(旧的,非工作的)答案中概述的方法更新qty ?

    您需要指定要更新的字段的完整路径。所以我认为在你的情况下,那将是:

    db.collection("users").doc(checkId).update({
      "myCart.0.qty": firebase.firestore.FieldValue.increment(1)
    }),
    

    【讨论】:

    • 先生,这是用 qty:1 覆盖“myCart.0”中的所有值,我只想增加该数量
    【解决方案3】:

    截至今天(2020 年 4 月 29 日)...这是经过我测试的。

    假设我的数据结构是这样的:

    集合:用户 任何文件:说 jdfhjksdhfw 它有一张像下面这样的地图 地图名称:UserPageVisits 映射字段:field1、field2、field3 等

    现在我们可以像下面这样增加地图中的数字字段:

    mapname.field1 等...

    即使用点运算符访问地图内的字段,就像您访问 javascript 对象一样。

    JAVA 代码 (Android),使用事务更新字段,以便它们可以原子完成。

    transaction.update(<documentreference object>,"UserPageVisits.field1",FieldValue.increment(1));
    

    我刚刚推送了我的应用程序的一个版本,它使用了这个概念并且它正在运行。

    赞!!

    致以最诚挚的问候

    【讨论】:

    • 谢谢!这适用于 Flutter SDK,这意味着我不必先读取值、递增然后再写入。我可以直接增加。为我节省了一堆重新配置工作,这应该是公认的答案!
    • 很高兴它对您有所帮助。 :-)
    【解决方案4】:

    以前的答案对我也有帮助,但不要忘记“合并”属性!!!否则它将覆盖您的整个数组,丢失其他字段。

    var myIndex = 0;
    const userRef = db.collection('users').doc(checkId);
    return userRef.update({
          'myCart.${myIndex}.qty': admin.firestore.FieldValue.increment(1)
        }, {
            merge: true
        });
    

    【讨论】:

    • .update() 方法没有{ merge: true } 选项。相信你在想.set(data, { merge: true})
    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2021-03-18
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多