簡體   English   中英

Cloud Firestore:使用動態鍵更新嵌套對象中的字段

[英]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);

https://jsbin.com/hihifedizu/edit?js,console

我覺得這是上述所有解決方案中最簡單的解決方案:)

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM