Firestore 结构数据 - 选件和用户节点



我将制作一个有两个选项卡的Android应用程序。第一个选项卡显示所有优惠,用户可以喜欢任何优惠。第二个选项卡显示用户喜欢的产品/服务。我希望当用户第一次打开应用程序时,他可以在不登录的情况下看到所有优惠。

产品/服务集合具有以下字段:

offers {  --collection
offerid{ --document
{
name
desc
img
}
}
}

用户集合具有以下字段:

users { --collection
userid{  --document
{
firstname
lastname
desc
img
phoneNumber 
}
}
}

我的问题是如何在报价和用户节点之间建立关系?

我试图为用户集合建立一个子集合,称为 likedoffers,在那里我将相同的报价信息存储在文档中。

users { --collection
userid{
{
firstname
lastname
desc
img
phoneNumber 
{likedoffers --collection
{
firstname
lastname
desc
img
phoneNumber 
}
}
}
}
}

但我想避免信息重复。 你能帮我吗?

为了实现这一点,我建议你有一个Cloud Firestore数据库结构,它应该看起来像这样:

Firestore-root
|
--- users (collection)
|     |
|     --- userId1 (document)
|           |
|           --- //user details
|
--- offers (collection)
|
--- userId1 (document)
|
--- userOffers (collection)
|
--- offerId1 (document)
|
--- isFavorite: true
|
--- //offer details

若要获取属于单个用户的所有选件,只需查询数据库以获取集合userOffers所有选件(文档)。若要仅获取收藏的选件,请使用.whereEqualTo("isFavorite", true)查询数据库以获取userOffers集合中的所有选件(文档)。对于第一种情况,您只需要使用如下CollectionReference

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference offersRef = rootRef
.collection("offers")
.document(userId1)
.collection("userOffers");

然后遍历userOffers集合以获取所有报价文档,无论是否是收藏夹。

对于第二种情况,您需要使用如下query

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference offersRef = rootRef
.collection("offers")
.document(userId1)
.collection("userOffers");
Query query = offersRef.whereEqualTo("isFavorite", true);

您需要做同样的事情,但这只会得到最喜欢的优惠。

我没有在这个数据库结构中包含名字、姓氏和其他此类细节等详细信息,因此您可以专注于集合和文档之间的关系。

根据上一条评论,您的数据库结构应如下所示:

Firestore-root
|
--- users (collection)
|     |
|     --- userId1 (document)
|           |
|           --- //user details
|
--- offers (collection)
|
--- offerId1 (document)
|
--- isFavorite: true
|
--- users
|     |
|     --- userId1: true
|     |
|     --- userId2: true
|
--- //offer details

若要查询未经身份验证的用户的所有产品/服务,请执行以下操作:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference offersRef = rootRef.collection("offers");

对于第二种情况,这是查询:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference offersRef = rootRef.collection("offers");
Query query = offersRef.whereEqualTo("users." + userId1, true).whereEqualTo("isFavorite", true);

在这种情况下,不要忘记添加将出现在 logcat 中的索引。

将 JSON 格式更改为

"offers" : {
"81d19e85-8c6c-4824-9fb1-61a7cd316e32" : {
"offerName" : "offer",
"offerId" : "81d19e85-8c6c-4824-9fb1-61a7cd316e32",
},
"e2ec0556-4420-4d2f-b346-0b5cebeb1ebe" : {
"offerName" : "offer",
"offerId" : "e2ec0556-4420-4d2f-b346-0b5cebeb1ebe",
}

然后在保存时获取优惠 ID 并存储在收藏优惠节点中。!

创建节点收藏的选件,然后添加查询,例如

String id = offer.getOfferId(); //offer id

mdatabaseref.child("favorite offers ").child(mAuth.getCurrentUser().getUid()).child(id).setValue(offer)并使用每个用户的用户ID获得每个用户最喜欢的优惠!

并避免重复保存

希望这对您有所帮助。!

最新更新