所以我有一个emojiCounter
用于存储对象数组的字段,例如
emojiCounter : [{emoji : 'haha', by : 'user1'},{emoji : 'haha', by : 'user2'}]
但我试图找出如何更新的对象,如果用户多次在这种情况下,选择不同的表情符号,因为我只需要更新emoji
的userName
所以我有一个emojiCounter
用于存储对象数组的字段,例如
emojiCounter : [{emoji : 'haha', by : 'user1'},{emoji : 'haha', by : 'user2'}]
但我试图找出如何更新的对象,如果用户多次在这种情况下,选择不同的表情符号,因为我只需要更新emoji
的userName
由于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
。如果你想避免这种情况,你应该采用另一种方法。例如,允许用户只更新他的表情符号(例如,每个用户一个表情符号文档)并拥有一个云函数,当这些文档之一更新时触发,并更新包含数组的中央文档。您应该使用事务来执行更新。