根据您的数据库结构,如下所示:
Firestore-root
|
--- Cars (collection)
|
--- $cardId (document)
|
--- bookings (collection)
|
--- $bookingId
|
--- bookedBy: "bogdanmaris11@yahoo.com"
|
--- endDate: 31 May, 2021...
|
--- finalPrice: 1998
|
--- startDate: 30 May, 2021...
要获取与特定用户对应的所有预订,需要Cloud Firestore collection group query。此查询如下所示:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query queryByEmail = rootRef.collectionGroup("bookings").whereEqualTo("bookedBy", "bogdanmaris11@yahoo.com");
queryByEmail.get().addOnCompleteListener(/* ... /*);
需要注意三件事。要从此查询中获得所需的结果,您可以检查电子邮件地址,因为您可能有错字 bogdanmari(u)s11@yahoo.com,其中缺少“u”。其次,最好根据用户的 UID 而不是电子邮件地址过滤用户,因为用户可以随时更改电子邮件地址,而 UID 将始终保持不变。第三个,据我了解,您打算使用Firebase-UI library,这很好。在这种情况下,应将“queryByEmail”传递给 FirestoreRecyclerOptions.Builder 的 setQuery() 方法。但是,可能会出现问题,因为每个查询都需要 index 和 numbers of indexes are limited in Firestore。
根据你写的:
我正在考虑将用户预订的所有汽车及其日期保存在一个对象或类似的东西中,但我想不通。
这是个好主意。这与对象无关,更多的是关于子集合或新的顶级集合,您可以在其中嵌套与特定用户对应的所有预订。在第一种情况下,您的架构将如下所示:
Firestore-root
|
--- bookings (collection)
|
--- $uid (document) //Not email address
|
--- userBookings (collection)
|
--- $bookingId
|
--- carId: "YI1J ... VSm0"
|
--- endDate: 31 May, 2021...
|
--- finalPrice: 1998
|
--- startDate: 30 May, 2021...
Booking 对象中不需要任何电子邮件地址,但如果您需要汽车数据,则需要“cardId”。要获得单个用户的所有预订,需要以下参考:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference userBookingsRef = rootRef.collection("bookings").document(uid).collection("userBookings");
userBookingsRef.get().addOnCompleteListener(/* ... /*);
第二个:
Firestore-root
|
--- allBookings (collection)
|
--- $bookingId
|
--- bookedBy: "longUid"
|
--- carId: "YI1J ... VSm0"
|
--- endDate: 31 May, 2021...
|
--- finalPrice: 1998
|
--- startDate: 30 May, 2021...
一个简单的查询(没有索引)在哪里可以解决问题:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query QueryByUid = rootRef.collection("allBookings").whereEqualTo("uid", uid);
QueryByUid.get().addOnCompleteListener(/* ... /*);
将第一个引用或此查询传递给您的“FirestoreRecyclerAdapter”,仅此而已。