基本上我想要的是如果一個檔案不存在然后創建一個新的(它現在可以正常作業)但是如果一個檔案確實存在,則將一個新物件推送到現有陣列。
我能夠從檔案中獲取資料并控制臺記錄它們,但不知道如何將新資料推送到現有檔案。
我的 FB 結構如下所示:
favorites
someUserID
Videos [
0: {
name: SomeName
url: SomeUrl
},
/* I would like to push new objects like this: */
1: {
name: data.name
url: data.url
},
]
這是我當前的代碼:
const { user } = UserAuth();
const UserID = user.uid;
const favoritesRef = doc(db, "favorites", UserID);
const test = async (data) => {
try {
await runTransaction(db, async (transaction) => {
const sfDoc = await transaction.get(favoritesRef);
if (!sfDoc.exists()) {
setDoc(favoritesRef, {
Videos: [{name: data.name}]
});
}
/* I got my document content here */
const newFavorites = await getDoc(favoritesRef);
console.log("Document data:", newFavorites.data());
/* And would like to push new Data here */
transaction.update(favoritesRef, { name: data.name});
});
console.log("Transaction successfully committed!");
} catch (e) {
console.log("Transaction failed: ", e);
}
}
uj5u.com熱心網友回復:
不確定這是否有幫助,但我通常做的是:
我正在添加每個登錄到陣列的用戶。
const snapshot = await getDoc(doc(db, "allUsers", "list"));
const currentUsers = snapshot.data().users;
await setDoc(doc(db, "allUsers", "list"), {
users: [...currentUsers, { name, uid: userId, avatar: photo }],
});
我首先獲取串列中存在的專案,然后我創建一個新專案,其中包含以前的所有專案和我正在添加的專案。currentUsers 是該卡索中的當前串列。也許你應該試試 thist 而不是Videos: [{name: data.name}]
setDoc(favoritesRef, {
Videos: [...currentVideos, {name: data.name}]
})
uj5u.com熱心網友回復:
更新陣列 Firestore 現在有一個函式允許您更新陣列而無需再次撰寫代碼:
更新陣列中的元素
如果您的檔案包含一個陣列欄位,您可以使用
arrayUnion()andarrayRemove()來添加和洗掉元素。arrayUnion()將元素添加到陣列中,但只添加尚未存在的元素。arrayRemove()洗掉每個給定元素的所有實體。
import { doc, updateDoc, arrayUnion, arrayRemove } from "firebase/firestore";
const washingtonRef = doc(db, "cities", "DC");
// Atomically add a new region to the "regions" array field.
await updateDoc(washingtonRef, {
regions: arrayUnion("greater_virginia")
});
// Atomically remove a region from the "regions" array field.
await updateDoc(washingtonRef, {
regions: arrayRemove("east_coast")
});
uj5u.com熱心網友回復:
我只是這樣想的:
const { user } = UserAuth();
const UserID = user.uid
const favoritesRef = doc(db, "favorites", UserID)
const test = async (data) => {
try {
await runTransaction(db, async (transaction) => {
const sfDoc = await transaction.get(favoritesRef);
if (!sfDoc.exists()) {
await setDoc(favoritesRef, {
favs: [
{
name: data.name,
ytb: data.ytb,
url: data.url
}]})
}
const doesExists = sfDoc.data().favs.some((fav) => fav.name === data.name)
console.log(doesExists)
if (doesExists === true)
{
console.log("AlreadyExist")
}
else {
const currentData = sfDoc.data().favs
transaction.update(favoritesRef, {
favs: [...currentData,
{
name: data.name,
ytb: data.ytb,
url: data.url
}]}
)}
});
console.log("Transaction successfully committed!");
} catch (e) {
console.log("Transaction failed: ", e);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/481048.html
標籤:javascript 反应 火力基地 谷歌云火库
