【问题标题】:Delete an object inside of array with firestore使用firestore删除数组内的对象
【发布时间】:2019-06-23 10:44:11
【问题描述】:

我想通过数组中的属性“id”查询特定对象并删除/删除整个对象。这可以通过firestore实现吗?

我的 Firestore 结构如下所示:

现在我有一个名为removeCard() 的函数,它接收作为firestore 中的文档ID 的docId 和作为对象内的属性“id”值的cardId。

removeCard() 函数:

export const removeCard = (retroId, cardId) => {
  return (dispatch, getState, { getFirestore }) => {
    // make async call to database
    const firestore = getFirestore();

    firestore.collection('retros').doc(retroId).update({
      // firestore query to remove/delete this card.
    }).then(() => {
      dispatch({ type: 'DELETE_CARD_SUCCESS' });
    }).catch(err => {
      dispatch({ type: 'DELETE_CARD_ERROR' }, err);
    });
  }
};

但我不知道如何执行此查询,或者是否可以使用 Firestore。任何帮助表示赞赏。请告诉我是否应该提供更多信息以使我的问题更清楚。

【问题讨论】:

    标签: reactjs firebase google-cloud-firestore


    【解决方案1】:

    实际上,在撰写本文时,使用array-contains 查询存储在数组中的对象的特定属性是不可能的。

    存在一种可能的解决方法,即查询整个对象

    你的情况是这样的

    db.collection('retros').where("cardsAction", "array-contains", {id: "65....", content: "this is...", time: ....})
    

    但显然这种解决方法对您的情况没有用处,因为 timecontent 的值可能会有所不同。

    换句话说,您可能需要更改数据模型。

    一种可能的方法是复制您的数据(在 NoSQL 世界中很常见)并拥有另一个数组,其中仅包含 cardActionids,例如:

    cardActionIds = ["65....", "5789", ....]
    

    这样您就可以使用array-contains,一旦找到与cardActionIds 对应的文档,您就可以操作另一个数组(即cardAction

    【讨论】:

    • 这就是我所期望的。如果谷歌将来可以使这成为可能,那就太好了。您有什么想法可以更改我的数据模型以使其正常工作吗?顺便说一句,谢谢你的回答!
    • 除了拥有一个数据集合的容器之外,您将这些数据放在一个数组中是否有特定的原因?比如前端使用数组,显示整个cardsAction列表?
    • 我在回答中添加了一种可能的方法。
    • 谢谢,会看看的。干杯伙伴。
    猜你喜欢
    • 2023-02-08
    • 2018-06-17
    • 1970-01-01
    • 2022-11-10
    • 2019-02-08
    • 1970-01-01
    • 2021-05-14
    • 2021-05-05
    • 1970-01-01
    相关资源
    最近更新 更多