Вот моя структура данных, как она организована (база данных Firebase):
-database
-productsList
-item1: 0
-item2: 0
-item3: 0
-item4: 0
-orders
-order1:
-...
-order2:
-...
-...
Я создаю приложение для покупок со списком продуктов.Клиенты могут выбрать, что они хотят купить и сделать заказ.Когда они это сделают, количество продукта увеличится в зависимости от того, что они выбрали.Скажем, клиент решил купить 2 единицы товара 2 и 5 единиц товара 4, когда кто-то отправляет запрос, он напишет в другом месте со следующими данными:
-orders
-orderKey
-items
-item2: 2
-item4: 5
Затем список обновится.to (на основе метода onCreate):
-productsList
-item1: 0
-item2: 2
-item3: 0
-item4: 5
Но давайте предположим, что другой клиент одновременно сделал запрос, список продуктов должен это подтвердить.
Мне хорошо известны транзакции Firebase, и это должно быть реализовано как транзакция, а не как обновление.Тем не менее, все примеры, которые тщательно изучены здесь, показывают, как обновить один узел, а не несколько дочерних узлов.
Для этого я использую облачные функции, это означает, что я использую машинопись.
Каков наилучший подход для обновления нескольких дочерних объектов с помощью транзакции?
Как можно получить и увеличить только желаемые узлы?
Пожалуйста, любая помощь будет принята с благодарностью.
РЕДАКТИРОВАТЬ : После того, как Фрэнк ван Пуффелен ответил на мой вопрос, я решил прояснить, что именно нужно делать.
Я хочу обновить один узел с именем productsList и, в этом примере, его дочерние узлы item2 и child4 .
Вот некоторый код, чтобы проиллюстрировать это лучше:
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp(functions.config().firebase)
export const onOrderCreate = functions.database
.ref('/orders/{oid}')
.onCreate(async (snapshot, context) => {
const orderId = context.params.oid
console.log(`new order made: ${oid}`)
const orderData = snapshot.val()
const items = getProductsAndQuantities(orderData)
const path = 'productsList'
return admin.database().ref(path).transaction(items => {
// I would like to know if there's a way to update only the bought items, like
const updatedList = {
'item2': item2oldValue + 2,
'item4': item2oldValue + 5
}
return updatedList
})
})
// Get the order data and return only the items and its quantities
function getProductsAndQuantities(data: any): Object {
// Return items, exemple
const products = {
'item2': 2,
'item4': 5
}
return products
}