[英]Cloud Firestore: Update fields in nested objects with dynamic key
遵循firestore的官方文檔:
{
name: "Frank",
favorites: { food: "Pizza", color: "Blue", subject: "recess" },
age: 12
}
// To update favorite color:
db.collection("users").doc("frank").update({
"favorites.color": "Red"
})
我想使用動態鍵而不是顏色。
db.collection("users").doc("frank").update({
"favorites[" + KEY + "].color": true
});
這當然是不可能的,並且會引發錯誤。
我一直在嘗試這樣做:
db.collection("users").doc("frank").update({
favorites: {
[key]: {
color": true
}
}
});
它實際上是使用正確的密鑰進行更新,但不幸的是,它正在覆蓋其他密鑰(它們正在被刪除)。
我找到了受 firebase 解決方案啟發的解決方案(將“/”替換為“.”)。
var usersUpdate = {};
usersUpdate[`favorites.${key}.color`] = true;
db.collection("users").doc("frank").update(usersUpdate);
這個解決方案對我有用:
db.collection('users').doc('frank').update({
['favorites.' + key + '.color']: true
});
關於潛在陷阱的說明:在發現您可以使用點語法更新嵌套字段后,我嘗試以相同的方式使用set()
,因為無論對象是否已經存在,我都需要它來工作:
var updateObj = {['some.nested.property']: 9000};
docRef.set(updateOb, {merge: true});
不幸的是,這不起作用——它設置了一個鍵為some.nested.property
的屬性。 不一致,但還好。
幸運的是,似乎set(updateObj, {merge: true})
了深度合並,因此如果您將更新對象構造為完全嵌套的對象,則嵌套對象也將被正確合並:
// create the object
db.doc('testCollection/doc').set({p1: {['p2']: {p3: true}}}, {merge: true})
// update the existing object
db.doc('testCollection/doc').set({p1: {['p2']: {p4: true}}}, {merge: true})
// result is now this:
{ p1: { p2: { p4: true, p3: true } } }
您可以更新變量(ly)命名嵌套對象的特定字段,如下所示。
ref.set({
name: "Frank",
favorites: { food: "Pizza", quantity: 2 }
});
//now the relevant update code
var name = "favorites";
var qty = 111;
var update = {};
update[name+".quantity"] = qty;
ref.update(update);
我覺得這是上述所有解決方案中最簡單的解決方案:)
db.collection("users").doc("frank").update({ [`favorites.${KEY}.color`]: true });
您可以使用
var auxKey = "history." + someVar;
var dataToUpdate = {
[auxKey]: "new data generated"
};
db.collection("users").doc("frank").update(dataToUpdate);
2022 年 Web 版本 9 更新(模塊化):
const docRef = doc(db, 'users', frank);
var usersUpdate = {};
usersUpdate[`favorites.${key}.color`] = true;
updateDoc(docRef, userUpdate);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.