如何使用 Firestore 中的对象数组更新字段中的特定对象?

IT技术 reactjs firebase google-cloud-firestore
2021-05-06 05:18:13

所以我有一个emojiCounter用于存储对象数组的字段,例如

emojiCounter : [{emoji : 'haha', by : 'user1'},{emoji : 'haha', by : 'user2'}]

但我试图找出如何更新的对象,如果用户多次在这种情况下,选择不同的表情符号,因为我只需要更新emojiuserName

1个回答

由于emojiCounter是一个Objects数组,您需要首先读取该数组,在前端更新它,然后将其保存回 Firestore。使用该array-union()方法将不起作用,因为它是一个对象数组。

您可以使用以下代码进行验证。对象是添加的,而不是更新的。

  const db = firebase.firestore();
  const docRef = db.collection('testSO').doc('testSO');

  const emojiCounter = [
    { emoji: 'haha', by: 'user1' },
    { emoji: 'haha', by: 'user2' },
  ];

  docRef
    .set({ emojiCounter })
    .then(() => {
      return docRef.get();
    })
    .then((doc) => {
      console.log('#1', doc.data().emojiCounter);

      return docRef.update({
        emojiCounter: firebase.firestore.FieldValue.arrayUnion({
          emoji: 'hoho',
          by: 'user1',
        }),
      });
    })
    .then(() => {
      return docRef.get();
    })
    .then((doc) => {
      console.log('#2', doc.data().emojiCounter);

      return docRef.update({
        emojiCounter: firebase.firestore.FieldValue.arrayUnion({
          emoji: 'hihi',
          by: 'user2',
        }),
      });
    })
    .then(() => {
      return docRef.get();
    })
    .then((doc) => {
      console.log('#3', doc.data().emojiCounter);
    });

上述注意,你可能会遇到与解决的问题,因为,这取决于你的应用程序的功能,它可能意味着user1可能改变emoji的值user2如果你想避免这种情况,你应该采用另一种方法。例如,允许用户只更新他的表情符号(例如,每个用户一个表情符号文档)并拥有一个云函数,当这些文档之一更新时触发,并更新包含数组的中央文档。您应该使用事务来执行更新。


此外,由于您使用的是一个包含所有用户表情符号的数组,请注意字段值最大大小:1,048,487 字节。