【问题标题】:firestore nested object field needs updating, not replacingfirestore 嵌套对象字段需要更新,而不是替换
【发布时间】:2018-08-13 13:23:54
【问题描述】:

我正在创建一个应用程序,其中显示公告,存储在 firestore 中,并且每个公告都有一个 hasRead 对象。 它的工作原理是,当用户阅读公告时,它在用户应用程序上显示为已读。但是当另一个用户正在阅读相同的公告时,他/她的用户标识被存储,覆盖了存储的任何其他用户标识。

这是他的存储方式。

setAnnounceToRead(userId) {
    firebase.firestore().collection('announcements').doc(this.state.id).set({
        hasread: {
            userId
        }
    },
    { merge: true });
}

我已经发现这是因为合并,因为它没有“添加”usrid,而是覆盖了它。

如何添加阅读公告的每个用户 ID,但保留现有的用户 ID?

干杯

【问题讨论】:

    标签: react-native google-cloud-firestore


    【解决方案1】:

    现在,您将每个用户的 UID 存储为名为 userId 的字段。由于您为每个用户使用相同的字段名称,因此您最终只存储了最后一个用户的 UID。

    要存储所有用户的 UID,您通常需要这样的结构:

    hasread: {
        udartsUid: true,
        pufsUid: true
    }
    

    在您的代码中,将转换为:

    let update = {};
    update[userId] = true;
    firebase.firestore().collection('announcements').doc(this.state.id).set({
        hasread: update
    },
    { merge: true });
    

    但是这种类型的操作最近变得容易多了,因为 Firestore 现在有一些操作允许您使用数组来存储这种类型的信息。

    let doc = firebase.firestore().collection('announcements').doc(this.state.id);
    doc.update({ "hasRead": FieldValue.arrayUnion(userId) });
    

    这个 sn-ps 会将 userId 值添加到数组中,如果它不存在的话。如果值已经在数组中,它什么也不做。

    有关后者的更多信息,请参阅博文Better arrays in Cloud Firestore

    【讨论】:

    • 谢谢,我会尽快查看并通知您。
    • 我正在使用 react-native-firebase,但似乎还没有支持 FieldValue。
    • 确实,那个库好像还没有更新:github.com/invertase/react-native-firebase/blob/…
    • 确实如此,所以在更新之前,我应该使用您的第一个示例,对吗?
    猜你喜欢
    • 2019-02-13
    • 2021-04-14
    • 2021-12-15
    • 2018-08-15
    • 2019-06-02
    • 2018-11-08
    • 1970-01-01
    • 2018-11-12
    相关资源
    最近更新 更多