Firestore结构数据 - 商品和用户节点

时间:2018-01-15 08:54:38

标签: android firebase google-cloud-firestore

我打算制作一个有两个标签的Android应用。第一个标签显示所有优惠,用户可以喜欢任何优惠。第二个选项卡显示用户喜欢的优惠。我想当用户第一次打开应用程序时,他可以在不登录的情况下看到所有优惠。

优惠券集合包含以下字段:

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

用户集合包含以下字段:

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

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

我尝试为用户集合设置一个名为likesoffers的子集合,我在文档中存储商品的相同信息。

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

           }
}

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

2 个答案:

答案 0 :(得分:0)

将您的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获得每个用户的最爱优惠。

并避免重复保存

希望这对你有帮助。!

答案 1 :(得分:0)

为了达到这个目的,我重申你有一个Cloud Firestore数据库结构,它应该是这样的:

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

要获取属于单个用户的所有商品,只需查询您的数据库以获取userOffers集合中的所有商品(文档)。要仅获取收藏的优惠,请使用userOffers查询您的数据库以获取.whereEqualTo("isFavorite", true)集合中的所有优惠(文档)。对于第一种情况,您只需要使用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);

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

我没有在此数据库结构中包含详细信息,如firstname,lastname和其他此类详细信息,因此您可以专注于集合和文档之间的关系。

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

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中的索引。