6. 문서
● Firestore의 저장소 단위
● KEY, VALUE 쌍들로 이루어진 JSON 구조의 레코드
● 부울, 숫자, 문자열, 좌표, 배열, 맵 등 다양한 타입 지원
● 다음과 같이 ‘맵’으로 구조화 가능
“alovelace” : {
first: “Ada”,
last: “Lovelace”,
born: 1815
}
7. 컬렉션
● 문서를 담고 있는 컨테이너
● 관계형 DB의 테이블
사용자 = 컬렉션
alovelace, aturing = 문서
8. 계층적 데이터
● 문서는 하위컬렉션을 포함할 수 있음.
● 구조화 vs 계층
roomA 문서를 조회하면 데이터에는 {name: “my chat room”}만 포함.
roomA.messages 컬렉션의 방대한 채팅메세지까지 다 가져오지 않음.
=> 구조를 단순하게 만들면서 필요한 데이터만 조회가능
10. 데이터 조회하기 - 쿼리(1)
firestore()
.collection('chat')
.where('id', '==', 'tony')
key, 비교, value
11. 데이터 조회하기 - 쿼리(2)
● 쿼리 연산자: < , <= , ==, >, >=, array-contains
● array-contains
regions(배열)에 ‘west_coast’가 포함되어있는 모든 문서를 필터링
12. 데이터 조회하기 - 복합쿼리
● where()을 여러개 나열해서 and 조건으로 쿼리를 만들 수 있음.
-> state == ‘C0’ && name == ‘Denver’
-> state == ‘CA’ && population < 100000
● 범위 비교는 하나의 필드에 대해서만 가능.
-> (x) 서로 다른 필드에 범위 비교를 할 수 없음!!!
13. 쿼리 제한사항
● 여러 필드에 범위 필터가 있는 쿼리
● 논리적 OR 쿼리 => 앱에서 OR를 각각 조회한 후 병합
● != 쿼리 => 초과,미만으로 분할
ex) where(‘age’, ‘!=’, 30) => where(‘age’, ‘>’, 30).where(‘age’, ‘<’, 30)
14. 데이터 추가하기
● set() : 문서의 id를 지정. 없으면 생성하고, 있으면 덮어씀.
(merge옵션으로 완전히 덮어쓰지않고 병합가능)
● add() : 문서의 id를 무작위로 지정.
firestore().collection("users").doc("bob").set({name: 'Bob'});
firestore().collection("users").add({id: 'bob', name: 'Bob'});
15. 실시간 업데이트
● onSnapshot() 메소드를 사용해서 문서 수신대기를 할 수 있고
업데이트 될 때마다 콜백메소드가 호출됨.
Users 컬렉션의 userId 문서가 변경되면
콜백을 통해 변경된 문서가 전달된다.
19. 2. 친구추가
● 각 유저의 문서의 하위컬렉션에 친구목록 표시
● 나와 친구의 아이디 조합으로 채팅방 구분
● RDB에서는 친구관계를 별도의 테이블을 만들지만
Firestore는 복잡한 쿼리가 힘들기 때문에 하위컬렉션으
로 단순한 구조를 사용
friends {
user1: ‘alice’,
user2: ‘bob’,
date: ‘2020-06-12 xx:xx:xx’
}
20. ● 친구를 추가할 때 rooms 컬렉션에 room 문서를 추가
● room 문서에 message 하위컬렉션이 존재