Окончательное обновление
Я перешел от использования транзакции, основанной на ответе ниже от andresmijares, к использованию set ().
Теперь это позволяет мне записывать данные в БД.
var gradeDocRef = db.collection("students").doc(studentId);
console.log(gradeDocRef);
var setWithMerge = gradeDocRef.set({
"UnitGrades": {
[unitNo]: {
"CG": CG,
"PG": PG,
"TG": TG
}
}
}, { merge: true });
Редактировать
Я изменил код для транзакции на основе комментария от andresmijares ниже.
transaction.set(gradeDocRef, {merge: true}, {
но тогда получите эту ошибку?
Неизвестная опция 'UnitGrades' передана в функцию Transaction.set (). Доступные опции: объединить, объединить поля
У меня есть база данных облачного пожарного магазина, которая содержит коллекцию студентов.
Каждая коллекция учеников содержит студенческий документ с картой и подкартой, как показано ниже
UnitGrades:
{
IT1:
{
CG: "F"
PG: "F"
TG: "F"
id: "IT1"
name: "Fundamentals of IT"
type: "Exam"
}
У меня есть 10 юнитов на карте.
Каждый студент имеет одинаковую комбинацию единиц
Я хочу обновить карту на основе HTML-формы в начальной загрузке (форма работает, плюс довольно длинный, поэтому не помещайте ее сюда)
т.е. изменить студенческие оценки
Я использовал документацию по обновлению транзакций в Firestore и немного адаптировался для получения данных из формы в HTML.
let studentId = $(this).attr("data-student-id");
let unitNo = $(this).attr("data-unit");
let CG = $(this).attr("data-CG");
let PG = $(this).attr("data-PG");
let TG = $(this).attr("data-TG");
// Create a reference to the student doc.
var gradeDocRef = db.collection("students").doc(studentId);
console.log(gradeDocRef);
return db.runTransaction(function(transaction) {
// This code may get re-run multiple times if there are conflicts.
return transaction.get(gradeDocRef).then(function(gradeDoc) {
if (!gradeDoc.exists) {
throw "Document does not exist!";
}
// update the grades using a transaction
transaction.update(gradeDocRef, {
// in here is my error, I need to be able to select the map
// for the variable for UnitNo only and not wipe the other maps
"UnitGrades": {
[unitNo]: {
"CG": CG,
"PG": PG,
"TG": TG }
});
});
}).then(function() {
console.log("Transaction successfully committed!");
}).catch(function(error) {
console.log("Transaction failed: ", error);
console.log(studentId);
});
Код, который я реализовал, обновляет правильную карту юнитов, но затем стирает остальные UnitGrades. Что я действительно хочу, так это обновить карту объектов, указанную в переменной
UnitNo
и оставьте остальные части нетронутыми.
например. В настоящее время, если я обновляю IT1, это корректно обновляет оценки в карте, но затем стирает единицы IT2, IT3, IT12 и т. Д. С карты UnitGrades. Я действительно хочу, чтобы IT2, IT3, IT12 и т. Д. Оставались неизменными, а IT1 обновлялся новыми значениями. например, «F» меняется на «P»