пожарный магазин установлен с объединением истинного объекта переопределения - PullRequest
0 голосов
/ 01 сентября 2018

Предположим, у меня есть документ с следующими данными (без подколлекций)

"kdsjkasdlkfsalk" : {
    favouriteColor: "brown",
    age: 20,
    content: {
      rand1: "randAns1",
      rand2: "randAns2"
    }
 }

Теперь я хочу изменить favouriteColor и перезаписать content без изменения age. Поэтому я использую:

ref.set({
      favouriteColor: "blue",
      content: {
        newRand: "newRandAns",
        newRand2: "newRandAns2"
      },
    }, {merge:true})

Требуемый результат:

"kdsjkasdlkfsalk" : {
    favouriteColor: "blue",
    age: 20,
    content: {
      newRand: "newRandAns",
      newRand2: "newRandAns2"
    }
}

Фактический результат:

"kdsjkasdlkfsalk" : {
    favouriteColor: "blue",
    age: 20,
    content: {
      newRand: "newRandAns",
      newRand2: "newRandAns2",
      rand1: "randAns1",
      rand2: "randAns2"
    }
}

Как видите, {merge:true} предотвращает перезапись content и вместо этого просто добавляет новые поля.

Я могу подумать о 2 решениях, но они либо включают в себя сначала получение всех данных, либо сначала устанавливают content в логическое значение, а затем устанавливают его в требуемом объекте. Есть ли лучший способ получить желаемый результат?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Вместо использования set

Вы можете использовать update на

"kdsjkasdlkfsalk" : {
favouriteColor: "brown",
age: 20,
content: {
  rand1: "randAns1",
  rand2: "randAns2"
  }
}

Вы хотите сделать это, потому что вы предоставляете новые свойства для content. rand1 vs newRand

Слияние объединит новые свойства с существующим объектом.

Обновить пример (точечная запись)

firebase.firestore().doc("kdsjkasdlkfsalk").update({
    "color": "someNewColor",
    "content.rand1": "someNewRandValue",
    "content.rand2": "someNewRandValue"
});

или

const content = {
    rand1: "someNewRandValue",
    rand2: "someNewRandValue"
}

firebase.firestore().doc("kdsjkasdlkfsalk").update({
    "color": "someNewColor",
    content
});
0 голосов
/ 01 сентября 2018

Ваш фактический код после изменения цвета:

var obj = {
  favouriteColor: "brown",
  age: 20,
  content: {
    rand1: "randAns1",
    rand2: "randAns2"
  },
 {merge:true}
}

Вы можете очистить свойство содержимого

obj.content = {};

И новые значения

obj.content.newRand = "newRandAns";      
obj.content.newRand2 =  "newRandAns2";

А затем установите obj объект в Firebase ref.set(obj)

...