繁体   English   中英

如何将元素推送到 Firestore 文档集合中的数组?

[英]How can I push elements to array in firestore document collection?

我有个问题。 我需要在外卖网站上创建篮子功能。 我想要的是映射篮子项目,然后如果同一家餐厅有两个项目将它们推送到 firestore 中的指定餐厅,并将它们作为一个对象添加到“订单”集合中。

让我们说:

basket: [
  {id: 0, restaurantId: 0, price: 10, name: bla bla},
  {id: 1, restaurantId: 0, price: 99, name: hoho},
  {id: 2, restaurantId: 15, price: 2, name: DIFFERENT RESTAURANT}
]

现在我创建了类似的东西,但它并没有真正起作用,它将项目“推送”到“订单”集合中的指定餐厅,但它只发生一次,因此如果存在具有相同用户的对象,它不会推送另一个而是更新这个已经存在的。

basket.map(el => {
  restaurantRef.doc(el.restaurantId).update({
    [`orders.${user.id}.products`]: firebase.firestore.FieldValue.arrayUnion(el),
    [`orders.${user.id}.details`]: {
      name: user.name,
      status: "waiting",
      address: {
        city: "New York",
        ...
      }
    }
  })
})

user.id来自存储当前用户的对象。

所以我想要做的是将对象推送到内部嵌套数组的“订单”集合(/restaurants/ restaurantId /orders)。
这应该是这样的:

orders:{
  userId: {
    products: [{}, {}, {}],
    details: {}
  }, 
  anotherUserId: {
    products: [{}, {}, {}],
    details: {}
  }, 
  userId: {
    products: [{}, {}, {}],
    details: {}
  }, 
}

一位用户订购了两次,因为他可能在几天前​​和今天订购了一些东西,这就是它应该的样子。
我不知道我是否正确解释了这一点并错过了您需要帮助我的东西。

提前致谢,感谢您的时间。

问题可能是arrayUnion只添加了唯一值。 这可能是一个问题,因为您正在推送对象,我不确定 Firestore 是否会检查对象的内容以查看它们是否唯一。 也许尝试set.(PATCH_OBJECT_HERE, { merge: true})代替。

此外,对于您正在尝试做的事情,也许更好的解决方案(关于数据库性能)是按 restaurantId 将篮子项目分类到数组中,然后用更新推送每个数组。 这会使您的更新从 2​​ 次而不是 3 次下降。 为什么它可能更好的示例:如果您有 5 件商品并且它们都来自同一个餐厅 ID,那么您将进行 5 次更新,而不仅仅是 1 次。

我认为您的问题是您的orders无效。 Firebase 具有 JSON 结构。 所有的键都必须是唯一的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM