Если в одном ресторане не хватает кофе, как я могу обновить кофейные элементы для этого c ресторана?
Используя запрос collectionGroup, вы могли бы сделать следующее:
db.collectionQuery('items')
.where('name', '==', 'Coffee')
.get()
.then(function (querySnapshot) {
querySnapshot.forEach(function (doc) {
const itemQuantity = doc.data().itemQuantity;
if (itemQuantity === 0) {
const restaurantRef = doc.ref.parent.parent.parent.parent;
return restaurantRef.update( {....})
}
});
});
, альтернативно используя свойства parent
DocumentReference
и CollectionReference
.
Однако это может быть не самый эффективный и доступный способ, если у вас много ресторанов, потому что ваш запрос collectionGroup вернет много записей.
Более эффективным способом было бы сохранить набор из счетчиков и наблюдайте за ними с помощью слушателей Firestore или облачных функций.
Наконец, обратите внимание на важный момент: вы пишете «Меню может иметь несколько элементов. Элементы могут быть повторно использованы и, следовательно, присутствовать в нескольких меню». Обратите внимание, что items
документы в
collection('restaurants').doc('r1').collection('menus').doc('m1').collection('items')
и в
collection('restaurants').doc('r1').collection('menus').doc('m2').collection('items')
- это совершенно разные документы . Это отличается от мира SQL, где разные записи из одной таблицы могут указывать на одну и ту же запись из другой таблицы.
Заключение: у вас, скорее всего, должна быть одна коллекция itemsStock
на restaurant
, и каждый раз, когда один из элементов «потребляется / заказывается», вы уменьшаете его количество, используя FieldValue.increment(-1)
.
Другими словами, я советую отделить коллекции элементов, составляющих меню, от коллекции, содержащей счетчики элементов (т.е. коллекции itemsStock
). Первые предназначены для выбора пунктов меню, а вторые - для управления запасами ресторана. Когда гость / покупатель выбирает / заказывает товар, вы только уменьшаете коллекцию, содержащую счетчики товаров.
Обновление после вашего комментария:
Если вы хотите обновить все элементы «лазаньи» во всех меню ресторана (например, чтобы добавить ингредиент, как вы упомянули в своем комментарии), очень общий подход действительно состоит в том, чтобы изменить все соответствующие документы (это называется дублированием данных в мире № SQL).
Вы должны использовать точный код в верхней части моего ответа: вы запрашиваете все "лазанья" »документы о товарах во всех меню ресторана и их обновление. Вы можете запустить этот процесс с помощью облачной функции, которая будет «наблюдать» за основной коллекцией, в которой у вас есть ссылочные элементы: каждый раз, когда вы изменяете do c этой коллекции (то есть элемента), вы обновляете все похожие / соответствующие элементы. c в подколлекциях меню.