Я должен сказать, что я все еще не совсем уверен, чего вы пытаетесь достичь. Тем не менее, я думаю , что вы пытаетесь выполнить разовую транзакцию или атомом c -обновление, которое добавляет / обновляет вашу базу данных за один вызов. Затем, если что-то пойдет не так, вся транзакция завершится неудачно, в противном случае все это удастся .... для поддержания целостности базы данных.
Итак, если я прав, здесь есть облачная функция node.js (вызываемая другими функции, которые не экспортируются), которые я использую для удаления записей или узлов из моей RTDB Firebase. Дело в том, что это «atomi c update», поэтому оно либо все работает, либо все выходит из строя ... поддерживается целостность данных. Там, где я использую 'null' для удаления записей, вы можете использовать «math», «A», что угодно, чтобы добавлять или обновлять записи для соответствующих потомков. Вы просто должны установить правильные ссылки для этих детей. Затем один оператор await databaseRoot.update(atomicUpdate);
выполняет всю транзакцию. Пока это «обновление», создаются все несуществующие записи. Вы сможете увидеть, как это работает, из фрагмента кода, даже если он не указан c для вашей базы данных. Затем вам нужно выяснить, как вы заполняете atomicUpdate
из вашего массива. Надеюсь, я угадал вашу цель правильно, и это помогает. : -)
async function deleteChatThreadStructure(authenticatedUserId, participantId) {
var databaseRoot = db.ref();
var chatThreadId = setChatThreadId(authenticatedUserId, participantId);
var chatsNodeKey = "/chats/" + chatThreadId;
var chatsParticipantsNodeAuthUserKey = "/chatsParticipants/" + authenticatedUserId + "/" + participantId;
var atomicUpdate = {
[chatsNodeKey]: null,
[chatsParticipantsNodeAuthUserKey]: null,
};
try {
await databaseRoot.update(atomicUpdate);
console.info("Chat Thread Structure: " + chatThreadId + " deleted!");
}
catch (error) {
console.error("Remove Chat Thread Structure " + chatThreadId +
" failed with " + error.message);
}
}
Обновление: Когда я проверяю ваше «как это должно выглядеть», список под «mathlab» - это просто ключи без значений или дочерних элементов. Вы не можете сделать это в Firebase, который требует пары ключ-значение. Таким образом, вы можете хранить каждый из этих ключей с соответствующим значением «true», чтобы они представляли собой пары k / v, которые затем можно искать / обращаться к ним по отдельности, или я думаю, что вы можете сохранить массив в качестве значения для ключа «mathlab». Хотя я сам не пробовал.
Дальнейшее обновление: Я решил попробовать. Следующий код создал эту структуру базы данных. Вам нужно выбрать, какой вы предпочитаете и как вы хотите обрабатывать обновления и удаления. ![enter image description here](https://i.stack.imgur.com/XKal4.png)
const List<String> students = [
"Student 1",
"Student 2",
"Student 3",
"Student 4",
"Student 5",
"Student 6",
"Student 7",
"Student 8",
];
_atomicUpdate.addAll(
{
"/root/mathLabV1": students,
"/root/mathLabV2/${students[0]}": true,
"/root/mathLabV2/${students[1]}": true,
"/root/mathLabV2/${students[2]}": true,
"/root/mathLabV2/${students[3]}": true,
"/root/mathLabV2/${students[4]}": true,
"/root/mathLabV2/${students[5]}": true,
"/root/mathLabV2/${students[6]}": true,
},
);
// Add to database.
// This is a batched (atomic) update that either succeeds or all fails
// both database additions as one transaction.
// .update will add records when they don't exist (or replace them if they do).
await _referenceRoot.update(_atomicUpdate);
Обновление после вашего комментария ниже Чтобы проверить, существует ли идентификатор студента в 'mathLabV2', я использовал бы следующий код в Flutter / Dart .... вам нужно изменить его синтаксис в соответствии с вашими потребностями, но концепция та же:
_referenceRoot.child("root").child("mathLabV2").child(<your_student_id>).once()
.then((DataSnapshot snapshot) {
if (snapshot.value != null) {
<Do your update processing on the 'students' node using <your_student_id>>;
}
},
),