database - realtime - query snapshot firestore



Firestore에서 중첩 된 단일 쿼리로 작업하기 (1)

문제가 완전히 해결되면 100 % 확신 할 수 없습니다. 왜냐하면 문제가있을 수 있기 때문입니다. 그러나 5 분의 빠른 생각으로 다음과 같이 문제를 해결할 수 있다고 생각합니다.

Instagram과 비슷한 모델을 사용할 수도 있습니다. 내 기억이 나를 잘 봉사한다면, 그들이 사용하는 것은 events 수집이다. 이 특정 상황에서의 events 사용자가 취하는 모든 행동을 의미합니다. 따라서 comment 은 이벤트이고, like 것은 이벤트입니다.

이렇게하면 총 3 개의 주요 컬렉션이 필요하게됩니다.

users
-- userID1
---- userdata (profile pic, bio etc.)
---- postsByUser : [postID1, postID2]
---- followedBy : [userID2, ... ]
---- following : [userID2, ... ]
-- userID2
---- userdata (profile pic, bio etc.)


posts
-- postID1 (timestamp, so it's sortable)
---- contents
---- author : userID1
---- authorPic : authorPicUrl
---- authorPoints : 12345
---- taggedUsers : []
---- comments
------ comment1 : { copy of comment event }
---- likes : [userID1, userID2]
-- postID2 (timestamp)
---- contents
... 


events
-- eventID1
---- type : comment
---- timestamp
---- byWhom : userID
---- toWhichPost : postID
---- contents : comment-text
-- eventID2
---- type : like
---- timestamp
---- byWhom : userID
---- toWhichPost : postID

사용자 바이오 페이지의 경우 사용자에게 쿼리 users .

뉴스 피드의 경우 지난 1 일 (또는 임의의 시간 경과)에 사용자가 따르는 userID별로 모든 게시물에 대한 posts 을 쿼리합니다.

활동 피드 페이지 (댓글 / 좋아요 등)의 경우 지난 1 일 (또는 임의의 주어진 기간)으로 제한된 사용자 ID와 관련된 events 를 쿼리 events

마지막으로 사용자가 스크롤 할 때 다음 날에 게시물 / 이벤트를 쿼리합니다 (또는 해당 날짜에 새 활동이없는 경우)

다시 말하지만, 이것은 단지 간단한 생각 일뿐입니다. 저는 SOF의 장로가 보통 이러한 십자가를 못 박는 습관을 가지고 있음을 알고 있습니다. 그래서이 답변에 결함이 있다면 SOF의 동료 회원을 용서하십시오. :)

희망은 시스코,

행운을 빕니다!

최근 Firebase에서 Firestore로 데이터 모델을 옮겼습니다. 내 모든 코드가 작동하지만 일부 데이터를 검색하기 위해 중첩 된 쿼리와 관련하여 몇 가지 추악한 문제가 있습니다. 다음은 요점입니다.

지금이 부분의 데이터 모델은 다음과 같습니다 (예! 다른 팔로워 / 피드 예).

{
  "Users": { //Collection
    "UserId1" : { //Document
      "Feed" : { //Subcollection of Id of posts from users this user Follow
        "PostId1" : { //Document
          "timeStamp" : "SomeDate"
        },
        "PostId2" : {
          "timeStamp" : "SomeDate"
        },
        "PostId3" : {
          "timeStamp" : "SomeDate"
        }
      }
      //Some data
    }
  },
  "Posts":{ //Collection
    "PostId1":{ //Document
      "Comments" :{ //Subcollection
        "commentId" : { //Document
          "authorId": "UserId1"
          //comentsData
        }
      },
      "Likes" : { //Subcollection
        "UserId1" : { //Document
          "liked" : true
        }       
      }
    }
  }
}

내 문제는 그 다음 방법으로 쿼리해야 사용자의 피드의 게시물을 검색하는 것입니다 :

  • 내 피드에서 timeStamp까지 마지막 X 문서 주문자를 얻으십시오.

feedCol(userId).orderBy(CREATION_DATE, Query.Direction.DESCENDING).limit(limit)

  • 그 후 목록에서 검색된 각 게시물에 대한 단일 쿼리를 수행해야합니다. workoutPostCol.document(postId)

  • 이제 각 게시물의 데이터가 있지만 사용자 이름, 그림, 위치 등을 다른 Document 에있는 작성자에게 authorId . 목록에서 검색된 각 authorId 에 대해 다른 단일 쿼리를 다시 수행해야합니다. posts userSocial(userId).document(toId)

  • 마지막으로 중요하지는 않지만 내 현재 사용자가 이미 해당 게시물을 좋아했는지 알아야하므로 각 게시물 (다시)에 대한 단일 쿼리를 수행하고 내 userId가 posts/likes/{userId} 있는지 확인해야합니다.

지금은 모든 것이 작동하지만 Firestore 의 가격이 데이터베이스 호출의 수에 달려 있다고 생각하고 내 쿼리를 더 단순하게 만들지 않는다는 것을 생각하면 데이터 모델이 좋지 않다는 것을 알지 못합니다. 이런 종류의 데이터베이스에 대해서는 정상적인 SQL 로 이동하거나 다시 Firebase 돌아 가야합니다.

참고 사항 : 나는 모든 것을 알고, 내 사용자 또는 게시물 문서 내의 arraylists에이 좋아하는 것, 피드 등을 더 쉽게 이동시킬 수 있지만, 문서의 제한은 1MB 이고 이것이 많이 커지면 미래. 반면 Firestore 에서는 whereEqualTo 쿼리 (아직) 또는 여러 whereEqualTo 사용하는 OR 절을 허용하지 whereEqualTo .

나는 이런 종류의 ID's 관계를 저장하는 간단한 방법을 찾는 데 문제가있는 사용자들의 게시물을 많이 읽었습니다. Collections 에서 joinsqueries 를 만들려면 Arraylists 사용하는 것이 Arraylists 만 1MB의 한계로 인해 많은 한계가 있습니다.

누군가가 이것을 분명히하거나, 적어도 새로운 것을 가르쳐 주길 바랄뿐입니다. 어쩌면 내 모델은 단지 쓰레기이며 이것을 수행하는 간단하고 쉬운 방법이 있습니까? 또는 비 SQL 데이터베이스에서 내 모델을 사용할 수 없습니다.





google-cloud-firestore