Using “array-contains” Query for Cloud Firestore Social Media Structure

后端 未结 2 2046
梦如初夏
梦如初夏 2021-01-07 04:22

I have a data structure that consists of a collection, called \"Polls.\" \"Polls\" has several documents that have randomly generated ID\'s. Within those documents, there is

2条回答
  •  暗喜
    暗喜 (楼主)
    2021-01-07 04:40

    I did a real-time polls system, here is my implementation:

    I made a polls collection where each document has a unique identifier, a title and an array of answers.

    Also, each document has a subcollection called answers where each answer has a title and the total of distributed counters in their own shards subcollection.

    Example :

    polls/
      [pollID]
        - title: 'Some poll'
        - answers: ['yolo' ...]
        answers/
          [answerID]
            - title: 'yolo'
            - num_shards: 2
            shards/
              [1]
                - count: 2
              [2]
                - count: 16
    

    I made another collection called votes where each document is a composite key of userId_pollId so I can keep tracking if the user has already voted a poll. Each document holds the pollId, the userId, the answerId...

    When a document is created, I trigger a Cloud Function that grab the pollId and the answerId and I increment a random shard counter in this answerId's shards subcollection, using a transaction.

    Finaly, on the client-side, I reduce the count value of each shards of each answers of a poll to calculate the total.

    For the following stuff, you can do the same thing using a middle-man collection called "following", where each document is a composite key of userAid_userBid so you can track easily which user is following another user without breaking firestore's limits.

提交回复
热议问题