web-dev-qa-db-ja.com

Firestore Referenceデータ型とは何ですか?

私は新しいFirebase Firestoreを調べているだけで、 reference というデータ型が含まれています。これが何をするのか私にははっきりしません。

  • 外部キーのようですか。
  • 他の場所にあるコレクションを指すのに使用できますか?
  • referenceが実際の参照である場合、それをクエリに使用できますか?たとえば、テキストフィールドにuserIdを格納する代わりに、直接ユーザーを指す参照を作成できますか。そして、私はこのユーザリファレンスを問い合わせに使うことができますか?
114

参照は外部キーと非常によく似ています。

現在リリースされているSDKは他のプロジェクトへの参照を格納できません。プロジェクト内では、参照は他のコレクション内の他のドキュメントを指すことができます。

他の値と同様に、クエリで参照を使用できます。フィルタリング、順序付け、およびページング(startAt/startAfter)です。

SQLデータベースの外部キーとは異なり、参照は単一のクエリで結合を実行するのに役立ちません。それらを依存関係のある検索(結合しているように見える)に使用できますが、ホップごとにサーバーへの別のラウンドトリップが発生するので注意してください。

59
Gil Gilbert

Firestoreの参照を使用して私のために働いたことを以下に追加します。

他の答えが言うように、それは外部キーのようなものです。ただし、reference属性は参照ドキュメントのデータを返しません。たとえば、商品の属性の1つとしてuserRef参照を持つ商品のリストがあります。商品のリストを取得すると、その商品を作成したユーザーの参照が表示されます。しかし、それは私にその参考文献の中でユーザーの詳細を与えません。私は他のバックエンドをポインタ付きのサービスとして使用していましたが、それ以前はユーザーの参照IDだけでなくユーザーの詳細を返す "populate:true"フラグを持っていました。 ).

以下は、参照を設定し、商品リストのコレクションを取得してから、指定されたユーザー参照IDからユーザーの詳細を取得するために使用したコード例です。

コレクションに参照を設定します。

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) });

お役に立てれば

72
Ben Cochrane

参照によるクエリに対するJavascriptソリューションをお探しの場合-概念は、クエリステートメントで「ドキュメント参照」オブジェクトを使用する必要があるということです

teamDbRef = db.collection('teams').doc('CnbasS9cZQ2SfvGY2r3b'); /* CnbasS9cZQ2SfvGY2r3b being the collection ID */
//
//
db.collection("squad").where('team', '==', teamDbRef).get().then((querySnapshot) => {
  //
}).catch(function(error) {
  //
});

(ここでの回答に対する称賛: https://stackoverflow.com/a/53141199/1487867

1
Aswin Kumar