firestore嵌套对象字段需要更新,而不是替换

时间:2018-08-13 13:23:55

标签: react-native google-cloud-firestore

我正在创建一个应用,其中显示公告,并将其存储在firestore中,并且每个公告都有一个hasRead对象。 它的工作原理与用户阅读公告时一样,在用户应用中显示为已读。但是,当另一个用户正在阅读相同的公告时,他/她的优胜劣汰将被存储,并覆盖其他已存储的优胜劣汰。

这是他的存储方式。

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

我已经发现这是因为合并,因为它不会“添加” usrid,而是将其覆盖。

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

欢呼

1 个答案:

答案 0 :(得分: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) });

此代码段会将userId值添加到数组中(如果尚未存在)。如果该值已经在数组中,则不执行任何操作。

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