#firebase #google-cloud-firestore #google-cloud-functions
#firebase #google-облако-firestore #google-cloud-функции
Вопрос:
Мне нужно создать составной запрос, который извлекает весь документ с определенным значением на карте в массиве. Полезная часть моей базы данных выглядит следующим образом:
appointments(collection)
doc1(document)
people(array)
person1(map)
userId(field)
person2(map)
userId(field)
Мне нужно получить все документы (например, doc1), в которых есть люди с определенным идентификатором пользователя, который является константой. У меня есть общее представление о том, что должно произойти, но я не совсем понимаю запрос. В настоящее время у меня есть следующее:
const snapshot = db.collection('appointments').where('people.userId', 'array_contains', userId).get()
.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
db.collection('appointments').doc(doc.id).update({
//Change the data I need to change
},{merge:true});
});
});
Я не могу понять, как построить это предложение where. Кто-нибудь может мне помочь с этим?
Заранее спасибо!
Ответ №1:
В Firestore невозможно запрашивать вложенные значения карты в массиве. Вам нужно будет преобразовать эти данные во что-то, что можно запросить, или дублировать достаточное количество данных в другое поле, чтобы это стало возможным.
Одна вещь, которую вы можете сделать, это создать новое поле, содержащее только строки идентификатора пользователя, и использовать запрос, содержащий массив, для этого массива.
Комментарии:
1. Как бы это выглядело тогда, потому что, если бы у меня был отдельный массив с идентификаторами пользователя, я бы не знал, какие данные обновлять. Я что-то здесь упускаю?
2. Вам пришлось бы написать код для обновления всех дублирующихся данных, если что-то изменится. Это характерно для баз данных типа nosql, где данные дублируются.
3. Итак, если бы я создал массив со всеми идентификаторами пользователей в нем, я мог бы найти все документы, в которых мне нужно что-то изменить, затем выполнить цикл по массиву и проверить, есть ли у меня правильные данные (с помощью change.before.data()), затем изменить данные, это сработало бы?