Что такое справочный тип данных firestore?
Я просто изучаю новый Firebase Firestore и содержит тип данных, называемый reference
. Мне непонятно, что это делает.
- Как иностранный ключ?
- Можно ли указывать на коллекцию, которая находится где-то еще?
- Если
reference
является фактической ссылкой, могу ли я использовать ее для запросов? Например, могу ли я иметь ссылку, указывающую непосредственно на пользователя, вместо сохранения userId в текстовом поле? И могу ли я использовать эту пользовательскую ссылку для запросов?
Ответы
Ответ 1
Ссылки очень похожи на внешние ключи.
Выпущенные в настоящее время SDK не могут хранить ссылки на другие проекты. В рамках проекта ссылки могут указывать на любой другой документ в любой другой коллекции.
Вы можете использовать ссылки в запросах, как и любое другое значение: для фильтрации, упорядочения и подкачки (startAt/startAfter).
В отличие от внешних ключей в базе данных SQL, ссылки не полезны для выполнения объединений в одном запросе. Вы можете использовать их для зависимых поисков (которые выглядят как соединения), но будьте осторожны, потому что каждый прыжок приведет к очередному циклу на сервер.
Ответ 2
Добавляя ниже, что работает для меня, используя ссылки в Firestore.
Как говорят другие ответы, это как внешний ключ. Ссылочный атрибут не возвращает данные справочного документа. Например, у меня есть список продуктов со ссылкой на userRef в качестве одного из атрибутов продукта. Получение списка продуктов дает мне ссылку на пользователя, который создал этот продукт. Но это не дает мне детали пользователя в этой ссылке. Я использовал другой бэкэнд в качестве сервисов с указателями, у которых до этого был флаг "populate: true", который возвращает данные пользователя, а не просто ссылочный идентификатор пользователя, что было бы здорово иметь здесь (надеюсь, в будущем улучшении).).
Ниже приведен пример кода, который я использовал для задания ссылки, а также для получения списка продуктов, а затем для получения сведений о пользователе по указанному идентификатору ссылки.
Установить ссылку на коллекцию:
let data = {
name: 'productName',
size: 'medium',
userRef: db.doc('users/' + firebase.auth().currentUser.uid)
};
db.collection('products').add(data);
Получить коллекцию (продукты) и все ссылки на каждый документ (данные пользователя):
db.collection('products').get()
.then(res => {
vm.mainListItems = [];
res.forEach(doc => {
let newItem = doc.data();
newItem.id = doc.id;
if (newItem.userRef) {
newItem.userRef.get()
.then(res => {
newItem.userData = res.data()
vm.mainListItems.push(newItem);
})
.catch(err => console.error(err));
} else {
vm.mainListItems.push(newItem);
}
});
})
.catch(err => { console.error(err) });
Надеюсь это поможет
Ответ 3
Для тех, кто ищет решение Javascript для запроса по ссылке - концепция такова, что вам нужно использовать объект "ссылка на документ" в операторе запроса
teamDbRef = db.collection('teams').doc('CnbasS9cZQ2SfvGY2r3b'); /* CnbasS9cZQ2SfvGY2r3b being the collection ID */
//
//
db.collection("squad").where('team', '==', teamDbRef).get().then((querySnapshot) => {
//
}).catch(function(error) {
//
});
(Престижный ответ здесь: fooobar.com/info/17598711/...)