新しいFirebase Firestoreを探索しているだけで、というデータ型が含まれていますreference
。これが何をするのか私には分かりません。
- 外部キーのようなものですか?
- 他の場所にあるコレクションを指すために使用できますか?
reference
実際の参照の場合、クエリに使用できますか?たとえば、userIdをテキストフィールドに格納する代わりに、ユーザーを直接指す参照を設定できますか?また、このユーザー参照をクエリに使用できますか?
新しいFirebase Firestoreを探索しているだけで、というデータ型が含まれていますreference
。これが何をするのか私には分かりません。
reference
実際の参照の場合、クエリに使用できますか?たとえば、userIdをテキストフィールドに格納する代わりに、ユーザーを直接指す参照を設定できますか?また、このユーザー参照をクエリに使用できますか?回答:
参照は外部キーと非常によく似ています。
現在リリースされているSDKは、他のプロジェクトへの参照を保存できません。プロジェクト内では、参照は他のコレクション内の他のドキュメントを指すことができます。
他の値と同様にクエリで参照を使用できます:フィルタリング、順序付け、およびページング(startAt / startAfter)。
SQLデータベースの外部キーとは異なり、参照は単一のクエリで結合を実行するのに役立ちません。これらは依存ルックアップ(結合のように見える)に使用できますが、各ホップはサーバーへの別のラウンドトリップになるので注意してください。
friends
すべての友達をリストしたコレクションがあります(friends/myId
)。次に、このドキュメントfriends
を別のドキュメントのフィールドで参照します(group/groupId
)。そのグループにいる友達だけを表示して、次のようにしますwhere('friends.myId', '==', true)
。
Firestoreで参照を使用して私のために働いたことを以下に追加します。
他の答えが言うように、それは外部キーのようなものです。ただし、参照属性は参照ドキュメントのデータを返しません。たとえば、製品の属性の1つとしてuserRef参照を持つ製品のリストがあります。製品のリストを取得すると、その製品を作成したユーザーのリファレンスが得られます。しかし、それは私にその参照のユーザーの詳細を与えません。私は他のバックエンドをポインタを持つサービスとして使用しており、その前に "populate:true"フラグが付いているため、ユーザーの参照IDだけでなく、ユーザーの詳細を返すことができます。 )。
以下は、参照を設定し、製品リストのコレクションを取得して、指定されたユーザー参照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) });
お役に立てれば
db.collection('products').get()
。ユーザーを直接取得してみましたか?newItem.userRef.get()
代わりに機能するはずだと思いますdb.collection("users").doc(newItem.userRef.id).get()
uid
それを介してと参照を保存するだけで同じことができます。
reference
真の外部キーとして使用できない場合に機能する必要があるのはなぜですか?
reference
overの唯一の利点は、参照を直接string
呼び出すことができることですget()
。まだあまり役に立ちません。参照に対応するオブジェクトを自動的に入力するオプションを追加してほしいと思います!
参照によるクエリの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)