【问题标题】:Is there any way to add FieldValue.increment() inside FieldValue.arrayUnion?有什么方法可以在 FieldValue.arrayUnion 中添加 FieldValue.increment() 吗?
【发布时间】:2020-02-19 13:03:18
【问题描述】:

我创建了一个购物车应用。当用户单击同一产品时,我想增加数字。 如果用户点击同一个项目 10 次,我想像这样更新 firestore。

items:[{'productId':'1234','count':10},{'productId':'1111','count':1}]

所以,我决定使用FieldValue.increment(1)。但是在arrayUnion中添加时出现错误

错误

Unhandled Exception: PlatformException(error, Invalid data. FieldValue.increment() can only be used with set() and update(), null)

代码

  Future<void> addToCart(ProductModel model){
    var ref = _db.collection('cart').document('7iRLSvH5sgMjaBNw0V4E');

    return ref.setData({
      'userId':'1234',
      'items':FieldValue.arrayUnion([{
        'count':FieldValue.increment(1),
        'productId':model.subCategoryId,
        'productName':model.subCategoryName
      }])
    },merge: true);
  }

【问题讨论】:

  • 能分享一下错误信息吗?
  • @ralemos 我添加了错误

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

无效数据。 FieldValue.increment() 只能与 set() 和 update() 一起使用,null)

正如错误明确指出的那样,您只能在使用set()update() 函数时使用FieldValue.increment(),而在使用FieldValue.arrayUnion不能。您不能将元素添加到数组并同时增加其中一个元素。除此之外,FieldValue.increment() 只能增加一个 number 类型的属性,该属性应该在文档中不同地存在并且作为数组的成员。

如果您需要增加数组成员的值,您应该在客户端获取该数组,获取所需元素,更新它,然后将文档写回。

编辑:

如果是以下项目:

[{'productId':'1234','count':10}]

这是一个对象数组中存在两个属性的对象,您不能使用FieldValue.increment() 来增加单个对象的count 属性。您不能简单地将该对象映射到自定义对象。实际上,您的文档中有一个 HashMap 列表。因此,您需要为此编写代码,通过遍历列表,找到您要递增的相应count 属性,递增它,然后将文档写回。

【讨论】:

  • “计算项目”是什么意思?计算数组中数字的总和?
  • 如果用户点击同一个项目 10 次,我想像这样更新 firestore。 items:[{'productId':'1234','count':10},{'productId':'1111','count':1}]
  • 我想将这样的场景添加到 firestore..stackoverflow.com/a/55580075/8822337
  • 这不是完全相同的场景,因为该数组中只有字符串并且您有对象。所以你不能像你那样直接在数据库中增加它。您目前拥有的唯一解决方案是我的答案中的解决方案。我还鼓励您提交功能request
猜你喜欢
  • 1970-01-01
  • 2015-08-09
  • 2020-03-03
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 2015-07-13
相关资源
最近更新 更多