Подтвердить что ты не робот

Что такое справочный тип данных firestore?

Я просто изучаю новый Firebase Firestore и содержит тип данных, называемый reference. Мне непонятно, что это делает.

  • Как иностранный ключ?
  • Можно ли указывать на коллекцию, которая находится где-то еще?
  • Если reference является фактической ссылкой, могу ли я использовать ее для запросов? Например, могу ли я иметь ссылку, указывающую непосредственно на пользователя, вместо сохранения userId в текстовом поле? И могу ли я использовать эту пользовательскую ссылку для запросов?
4b9b3361

Ответ 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/...)