์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Decodable
- mongoose
- DispatchQueue
- Firestore
- ํ๋ก๊ทธ๋๋จธ์ค
- ExpressJS
- Mac
- Core Data
- MongoDB
- ์ฑ๋์์ธ
- SWiFT
- ios
- Filter
- ์๊ณ ๋ฆฌ์ฆ
- components
- RxSwift
- Encodable
- ์ง๋ฒ๋ณํ
- Codable
- nodejs
- Cloud Firestore
- Firestore CRUD
- AVAudioPlayer
- String.Index
- ์ฑ๋ง๋ค๊ธฐ
- UIRefreshController
- map
- Reduce
- Figma
- CRUD
- Today
- Total
Focus On Develop ๐ค๐ค
[Swift] Cloud Firestore(2) ์ค์ตํด๋ณด๊ธฐ ๋ณธ๋ฌธ
[Swift] Cloud Firestore(2) ์ค์ตํด๋ณด๊ธฐ
๋๋ฆฌ๋ฌ์ดํ 2021. 2. 10. 00:44์ง๋ ํฌ์คํ ์์๋ ๊ฐ๋จํ๊ฒ Cloud Firestore์ ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ์ ์ฅ๋๋์ง ์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด์๋๋ฐ์~!!
๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๋ชจ๋ฅด๋ฉด ๋จผ์ ๊ตฌ์กฐ๋ถํฐ ํ์คํ๊ฒ ์๊ณ ์ค์ต์ ์์ํ๋๊ฒ ์ข์ต๋๋ค ๐๐
๐ 2021/02/08 - [iOS [Swift]/๊ธฐ์ด๋ฅผ ํํํ!] - [Swift] Cloud Firestore(1) ๋ฐ์ดํฐ ๊ตฌ์กฐ
์ด๋ฒ์๋ ์ค์ ๋ก XCode์์ ์ด๋ป๊ฒ Firestore๋ฅผ ํตํด CURD๋ฅผ ํ ์ ์๋์ง ์ค์ตํด๋ณผ๊ฑฐ์์.
๋จผ์ ์ค์ต์ ์ํด์, Firestore๋ฅผ ๋น์ด์๊ฒ ์ค๋นํ๊ณ , Console์ ๋ฐ๋ก๋ฐ๋ก ํ์ธํ ์ ์๋๋ก ๋์์ค์๋ค!
Database ์ฐธ์กฐ
๋ณธ๊ฒฉ CRUD ์ค์ต์ ์์, ์ฐ๋ฆฌ๊ฐ Cloud์ Firestore์ด ์ด๋์๋์ง ์์น์ ๋ณด๋ฅผ ์์์ผ CRUD๋ฅผ ์งํํ๊ฒ ์ฃ ~?
์๋ ์ฝ๋๋ก ์ค์ ๋ก Firestore ์์ ์ฐ๋ฆฌ์ DB์์น๋ฅผ ์ฐธ์กฐํ ์ ์์ด์.
let db = Firestore.firestore()
๋ฐ์ดํฐ ์ ์ฅ (Create)
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋๋ ์ด์ ํฌ์คํ ์์ ์ ๋ฆฌํ๋ ๊ฒ์ฒ๋ผ Collection์ Document๋ฅผ ๋ง๋ค๊ณ , Document์ Data๋ฅผ ์ ์ฅํ๋ฉด ๋๊ฒ ์ฃ ? Documenet๋ฅผ ๋ง๋ค๋๋ ๋ช ์์ ์ผ๋ก Document ์ด๋ฆ์ ์ง์ ํ ์๋ ์๊ณ , ์๋์ผ๋ก ์ด๋ฆ์ ์ง์ด์ฃผ๋ Auto Generated ๋ฐฉ๋ฒ์ด ์์ด์. ๋จผ์ ๋ช ์์ ์ผ๋ก "users"๋ผ๋ collection์ "userid123"์ด๋ผ๋ document๋ฅผ ๋ง๋ค๊ณ , ๊ทธ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด๋ณผ๊ฒ์.
db.collection("users").document("userid123").setData(["firstname":"Tom", "lastname":"Bee", "age":26])
์ค์ค~~๐๐ ์์ํ๋ ๋๋ก Firebase Console์์ ๋ฐ์ดํฐ๊ฐ ๋ง๋ค์ด์ง๊ฒ ๋ณด์ด๋ค์. ์ญ์ ๋์ ๋ฐ๋ก๋ฐ๋ก ๋ณด์ฌ์ผ ์ฝ๊ฒ ์ดํด๊ฐ ๋๊ณ ํฅ๋ฏธ๊ฐ ์๊ธฐ๋ ๊ฒ ๊ฐ์์ ใ ใ ์ฌ๊ธฐ์ ์๋์ผ๋ก ์ฝ์์ด ๊ฐฑ์ ์ด ์๋๋ฉด ์๋ก๊ณ ์นจ์ ํด์ฃผ์ธ์ ~~
๋ค์์ผ๋ก, ์๋์ผ๋ก Document ์ด๋ฆ์ ์ง์ด์ฃผ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ ์์ฑํด๋ณผ๊ฒ์.
db.collection("users").addDocument(data: ["firstname":"Jay", "lastname":"Koo", "age":35])
// db.collection("users").document().setData(["firstname":"Jay", "lastname":"Koo", "age":35])
์ด๋ ๊ฒ addDocument Method๋ฅผ ๋ฐ๋ก ์ฌ์ฉํด์ค ์๋ ์๊ณ , document() ์ด๋ ๊ฒ ์ด๋ฆ์ ๋น์๋๋ฉด ์๋์ผ๋ก ์ด๋ฆ์ ์ง์ด์ค๋ต๋๋ค. ๋ฐ๋ก๋ฐ๋ก ์ ๋ฐ์์ด ๋์๋์ง ํ์ธํด์ค๋๋ค~~ ๐ค
์กฐ๊ธ๋ง ์์ฉํด๋ณด๋ฉด, ์ด๋ ๊ฒ ํน์ ๋ณ์์ document๋ฅผ ํ ๋นํ๊ณ ์ฌ์ฉํ ์๋ ์๊ฒ ๋ค์. ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ธฐ๋ ํ๊ณ , ์ ๋ฐ์ดํธ๋ ํ๊ณ , ๊ทธ๋ฌ๊ณ ์ถ์ ์๋ ์์์์~~ ใ ใ ๊ทธ๋ฆฌ๊ณ ์ด์ง๋ง ์์ธํ ๋ณด๋ฉด, "id"๋ผ๋ ํ๋๋ฅผ documentID๋ก ์ง์ ํด์คฌ์ด์. ์ด๋ ๊ฒ id๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ์ ํด๋์ผ๋ฉด, ๋ค๋ฅธ collection์ด๋ document์์ ์ฐธ์กฐํ ๋ ์ฐ์ผ ์๋ ์์ด์. (๋ง์น foreign key ๊ฐ์ด์)
let myNewDoc = db.collection("users").document() // create new doc
myNewDoc.setData(["firstname":"John", "lastname":"Qoo", "age":30, "id": myNewDoc.documentID])
์ด์ง ๋๋ ์ค์๋์~? ์๋ฅผ ๋ค์ด์ ์์ ๊ฐ์ด id๋ฅผ documentId๋ฅผ ์ฌ์ฉํด์ ์ง์ ํด์ฃผ๊ณ , ์๋ ์ฝ๋๋ฅผ ๊ฐ์ด ์คํํ๋ฉด
db.collection("allergies").document(myNewDoc.documentID).setData(["allergies":"peanuts"])
John์ ๋ํ ๋ฐ์ดํฐ๊ฐ users ์ปฌ๋ ์ ์ ์๊ธฐ๊ณ , allergies ์ปฌ๋ ์ ์ ๋ง๋ค๋ฉด์ ํ์์ document ์ด๋ฆ์ ๋์ผํ๊ฒ ๋ง์ถฐ ์ค ์ ์์ด์. ์ด๋ ๊ฒ ๊ตฌ์ฑํด๋์ผ๋ฉด, John์ ๋ ์ฝฉ ์๋ ๋ฅด๊ธฐ๊ฐ ์๋ค๊ณ ์ฝ๊ฒ ์ฐพ์๊ฐ ๋ฐฉ๋ฒ์ด ์๊ธฐ๊ฒ ์ฃ ~?ใ ใ
๋ฐ์ดํฐ ์ ๋ฐ์ดํธ (Update)
์ด๋ฒ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธ๋ฅผ ํด๋ด ์๋ค. ์๋ฅผ ๋ค์ด์ ์์์ ๋ง๋ ๋ฐ์ดํฐ์ userid123์ firstname์ Mike๋ก ๋ฐ๊พธ๊ณ ์ถ์ด์.
db.collection("users").document("userid123").setData(["firstname":"Mike"])
ํ.. firstname๋ง ์๋ก ์ง์ ํด์ฃผ๋ฉด ์ ๋ฐ์ดํธ ๋ ์ค ์์๋๋ฐ ๋ญํจ๋ฅผ ๋ดค์ด์. ์๋ ๋ง๋ค์๋ lastname, age๋ ์จ๋ฐ๊ฐ๋ฐ ์๊ณ .. ใ ใ ์ด๋ ๊ฒ setData๋ฅผ ๊ทธ๋ฅ ์ฌ์ฉํด๋ฒ๋ฆฌ๋ฉด Overwrite(๋ฎ์ด์ฐ๊ธฐ) ํด๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ๋ ์ํํ๋ ์กฐ์ฌํด์ผ๋์. ๐
๊ทธ๋ผ ์ ๋ง๋ก ์ ๋ฐ์ดํธ๋ ์ด๋ป๊ฒ ํ ๊น์~?
db.collection("users").document("userid123").setData(["lastname":"Chang", "firstname":"Marly", "age":26], merge: true)
์ด๋ ๊ฒ setData๋ฅผ ์ฌ์ฉํ๋ฉด merge๋ผ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐ๋ก ์ฌ์ฉํ ์ ์์ด์. ๋ง ๊ทธ๋๋ก Mergeํ๋ฉด์ Overwrite ํ๊ฒ ๋ค๋ ๊ฑฐ์์! ์๋ ์๋ ํ๋๊ฐ์ ์ ๋ฐ์ดํธ ํด์ฃผ๊ณ , ์๋ ์๋ ํ๋๊ฐ์ ์๋ก ๋ง๋ค์ด์ค๋๋ค.
์ ๋ฐ์ดํธ๊ฐ ์ ๋์๊ณ , ์๋ก์ด ํ๋๋ ์ ์๊ฒผ๋ค์ ~~!! ๐๐ ๊ทธ๋๋ setData๋ฅผ ์ฌ์ฉํ๋๊ฑด.. ์ธ์ ๊น์ง๋ ๋งค์ฐ ์ํํ ์์๋ฅผ ๋ ๊ฐ์ง๊ณ ์๋ค๋๊ฑฐ์์. ํน์๋ผ๋ ์ค์๋ก merge ํ๋ผ๋ฏธํฐ๋ฅผ ๋น ๋จ๋ ธ๋ค๊ณ ์๊ฐํ๋ฉด.. ๋์ ! ์ด์ ์ ์ ์ฅ๋์๋ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ Overwrite๋ ๊ฑฐ์์ ๐ญ
์ฌ์ค์ setData๋ฅผ ์ฌ์ฉํด์ ์ ๋ฐ์ดํธ ํ๋ ๋ฐฉ๋ฒ๋ ์์ด์~ ํ๊ณ ์ ๋ฆฌํ๊ฑฐ๊ตฌ์~!!ใ ใ
์ค์ ๋ก๋ updateData Method๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ๐ ํธ - ์..
๋ฌผ๋ก , ์๋ ํ๋๋ ์ ๋ฐ์ดํธ ํด์ฃผ๋ฉด์ ์๋ก์ด ํ๋์ ๋ํ ๋ฐ์ดํฐ๋ ์ ๊ท๋ก ์์ฑํด์ค๋ต๋๋ค~~
db.collection("users").document("userid123").updateData(["firstname":"sarah", "hair":"black"])
๋ฐ์ดํฐ ์ญ์ (Delete)
์ด๋ฒ์๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ ์ญ์ ํด๋ณผ๊ฒ์! ๋จผ์ document๋ฅผ ํต์งธ๋ก ์ญ์ ํ๊ณ ์ถ์ด์. ์ด ์ฌ๋์ด ํ์ํํด๋ฅผ ํด๋ฒ๋ ธ์ด์..๐ญ
๊ทธ๋ด๋๋ ์ด๋ ๊ฒ documentId๋ฅผ ๊ฐ์ง๊ณ deleteํด๋ฒ๋ฆฌ๋ฉด ๋์! ๊ฐ๋จํ์ฅฌ~~?
db.collection("users").document("SepScv75QCfhd1rpaEeA").delete()
์ค์ ๋ก sep~~์ด์ฉ๊ตฌ ํ๋ document๊ฐ ์ญ์ ๋์์ด์. ์.. ์ข์! document๋ ์ญ์ ํ ์ ์๊ฒ ์ด. ๊ทผ๋ฐ ๋๋ ํ์์ ๋ณด์ค์ ํ๋ ํ๋๋ง ์ญ์ ํ๊ณ ์ถ์๋ฐ ์ด๋ป๊ฒ ํ์ง.. ๋ผ๊ณ ์๊ฐ์ด ๋์ จ๋ค๋ฉด ์ ์์ ๋๋ค!! ํ๋ ํ๋๋ง ์ญ์ ํ๊ธฐ ์ํด์๋ updateData Method๋ฅผ ์ฌ์ฉํด์ค์ผ ํ๋๋ฐ์, ์ด๋ ๊ฒ ์ค์ value๊ฐ์ FieldValue.delete()๋ก ๋ฃ์ด์ฃผ๋ฉด ๋๋ต๋๋ค! hair ํ๋๊ฐ ํ๋๋ง ์ญ์ ์๋ฃ!๐
db.collection("users").document("userid123").updateData(["hair":FieldValue.delete()])
Error Handling (์๋ฌ ํธ๋ค๋ง)
๋ฐ์ดํฐ ์กฐํํ๊ธฐ์ ์์, ์ฐ๋ฆฌ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ/์ ๋ฐ์ดํธ/์ญ์ ๋ฅผ ํ๋๋ฐ ํธ์ฅ~~์๋ ์คํจํ ์๋ ์์์์~~?
๊ทธ๋ด๋ ์๋ฌ๋ฅผ ํธ๋ค๋งํ๋ผ๊ณ ๋ฐ๋ก completion Handler๋ฅผ ์ ๊ณตํด์ฃผ๊ณ ์์ด์. ์๋ฅผ ๋ค์ด์ ์์์ ๋ฐ์ดํฐ ์ ์ฅ์ ์ฌ์ฉํ๋ addDocument ๋ฉ์๋๋ ํธ๋ค๋ฌ๋ฅผ ์ ๊ณตํด์.
db.collection("users").addDocument(data: [:]) { error in
// this code is run after the operation is complete
if error == nil {
// operation success
} else {
// error, do something
}
}
๋ฌผ๋ก setData, update, delete ๋ชจ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก Completion Handler๋ฅผ ์ ๊ณตํด์ค๋ต๋๋ค.
db.collection("users").document("userid123").setData([:], merge: true) { (error) in
// this code is run after the operation is complete
if error == nil {
// operation success
} else {
// error, do something
}
}
๋ฐ์ดํฐ ์กฐํ (Read)
firestore database ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๊ฒ์ push๋ฐฉ์๊ณผ pull๋ฐฉ์์ด ์์ด์. pull๋ฐฉ์์ ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ db์ ๋ญ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํด์ ๋ฐ๋๊ฑฐ๊ณ push๋ฐฉ์์ ๋ฐ์ดํฐ ๋ณ๋์ด ์์ผ๋ฉด db์์ ์์์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด์ฃผ๋ ๋ฐฉ์์ด์์.
๋จผ์ pull ๋ฐฉ์์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์์๋ณผ๊ฑฐ์์. ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๋ getDocument Method๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋๋ฐ์~!
ํน์ document ๋ฅผ ์กฐํํ๊ธฐ (pull)
์ด๋ ๊ฒ ์๋์์ฑ๊ธฐ๋ฅ์์ ์ค๋ช ์ ๋ณด๋ฉด, ํน์ document๋ฅผ ์์ฒญํ๋ ๊ฒฝ์ฐ ๋ฆฌํด๋ฐ๋ ๋ฐ์ดํฐ ํ์ ์ด FIRDocumentSnapshotBlock ์ด๋ค์! ์ฌ๊ธฐ์ ์ด ํ์ ์ ํ๋ฒ ์ฃผ๋ชฉํด๋ณผ๊ฒ์. ์ด ๋ฐ์ดํฐ ํ์ ์ DocumentSnapshot(์ค์ ์ถ์ถํ ๋ฐ์ดํฐ)์, Error(์๋ฌ)๋ก ๊ตฌ์ฑ๋์. ์๋ฏธ ๊ทธ๋๋ก DocumentSnapshot์ document ํ๋๋ฅผ ์๋ฏธํ๋๊ฑฐ์์.๐
์๋ฅผ ๋ค๋ฉด ์ด๋ ๊ฒ userid123์ ๋ํ document๋ฅผ ์์ฒญํ๊ณ , ๋ฆฌํด๋ฐ์ ๋ฐ์ดํฐ(snapshot)์ ๋ณด๋ฉด ์ฐ๋ฆฌ๊ฐ ์ ์ฅํ๋ userid123์ ๋ํ data๊ฐ ์ ๋๋ก ๋ด๋ ค์์์ ํ์ธํ ์ ์์ด์!
db.collection("users").document("userid123").getDocument { (snapshot, error) in
if error == nil && snapshot != nil && snapshot!.data() != nil {
print(snapshot!.data())
}
}
collection์์์๋ ๋ชจ๋ document๋ค์ ์กฐํํ๊ธฐ (pull)
์ด๋ฒ์๋ ํน์ document๊ฐ ์๋๋ผ, ์กด์ฌํ๋ ๋ชจ๋ document๋ฅผ ์กฐํํด๋ณผ๊ฑฐ์์. ๋์ผํ๊ฒ getDocuments๋ฅผ ํธ์ถํ๋๋ฐ ์ด๋ฒ์๋ collection์์ ๋ฐ๋ก getDocuments๋ฅผ ํธ์ถํด์ฃผ๋ฉด ๋ฉ๋๋ค. ์ด๋ฒ์๋ ์๋์์ฑ ๊ธฐ๋ฅ์์ ํ๋ฒ ์ค๋ช ์ ๋ณผ๊น์?
์ค! ์ด๋ฒ์๋ ์๊น์ ์ฝ~๊ฐ ๋ค๋ฅด๊ฒ ๋ฐ์ดํฐ ํ์ ์ด FIRQuerySnapshotBlock ์ด๋ค์! ์ด ๋ฐ์ดํฐ ํ์ ์ QuerySnapshot(์ค์ ์ถ์ถํ ๋ฐ์ดํฐ), Error(์๋ฌ)๋ก ๊ตฌ์ฑ๋์. ์ด๋ฒ์๋ Query๋ฐ์ดํฐ์ ๋ํ snapshot์ผ๋ก, ๋ชจ๋ documents๋ค์ Arrayํํ๋ก ๊ฐ์ง๊ณ ์์ด์. snapshot.documents๋ก ํด๋น array์ ์ ๊ทผํ ์ ์๋ต๋๋ค.
db.collection("users").getDocuments { (snapshot, error) in
if error == nil && snapshot != nil {
for document in snapshot!.documents {
print(document.documentID)
}
} else {
// error. do something
}
}
์ค์ ๋ก firestore์ ์ ์ฅ๋ document์ ID๋ค์ด ์ ์ถ๋ ฅ๋์๋ค์~!!
์ ๋ฐ๋ผ์ค๊ณ ๊ณ์์ฃ ? ๐ ์กฐ๊ธ์ ์์ํ ์ ์์ด์! ๊ทธ์น๋ง ์์์ pull ๋ฐฉ์์ ๋ํ ๋ฆฌํด๋ฐ์ดํฐ ํ์ ๋ง ์ ์ดํดํ์ จ์ผ๋ฉด push๋ฐฉ์์ ์ ๋ง ๋ฐฉ์๋ง ๋ค๋ฅผ ๋ฟ ์์ ํ ๋์ผํ๋ต๋๋ค ๐ค๐ค
ํน์ document ๋ฅผ ์กฐํํ๊ธฐ (push)
์์์ ํ๋ ๊ฒ๊ณผ ๊ฑฐ์ ๋์ผํ๋ฐ ํธ์ถํ๋ Method๋ง addSnapshotListener๋ก ๋ฐ๋์์ฃ ??
์๊น๋ ์ฐ๋ฆฌ๊ฐ db๋ก "์ผ ์ด๊ฑฐ ๋ฐ์ดํฐ ์ค!" ๋ผ๊ณ ์์ฒญํด์ ๋ฐ์๋ค๋ฉด, ์ด๋ฒ์๋ db์์ ์ฐ๋ฆฌ์๊ฒ "์ผ ์ด๊ฑฐ ๋ฐ์ดํฐ ๋ณ๋์์ผ๋๊น ์ค๋ค. ํ ๊ฑฐ ์์ผ๋ฉด ์์์ ์ฒ๋ฆฌํด!" ๋ผ๊ณ ํ๋ ๋ฐฉ์์ด์์. ์ ๋ง ์ด๊ฒ๋ง ๋ฌ๋ผ์ ๐
let listener = db.collection("users").document("userid123").addSnapshotListener { (snapshot, error) in
if error == nil && snapshot != nil && snapshot!.data() != nil {
print(snapshot!.data())
}
}
์ด๋ ๊ฒ ์ฝ๋๊ฐ ์์ผ๋ฉด userid123์ด๋ผ๋ document ์์ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ/์ ๋ฐ์ดํธ/์ญ์ ๋๋ฉด ์ print() ๊ตฌ๋ฌธ์ด ์คํ๋๋๊ฑฐ์์. print()์ ์ค๋จ์ ์ ๊ฑธ๊ณ ๋๋ฒ๊น ํด๋ณด๋ฉด ์ต์ด์ ํ๋ฒ(์ด๊ธฐ db๋ฐ์ดํฐ ์ํ๋ฅผ ์ฝ์ด์ค๋๊ณผ์ ) ํธ์ถ์ด ๋๊ณ , ๊ทธ ๋ค์๋ถํฐ๋ ๋ณ๋์ด ์์๋๋ง ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด์ค๋ต๋๋ค. ํ๋ฒ Console์์ ๋ญ๊ฐ ์ญ์ /์ ๋ฐ์ดํธ/์ถ๊ฐ๋ฅผ ์ง์ ํด๋ณด์๊ธธ ์ถ์ฒ๋๋ ค์ ๐๐
collection์์์๋ ๋ชจ๋ document๋ค์ ์กฐํํ๊ธฐ (push)
์์์๋ ํน์ document ๋ด์ ๋ฐ์ดํฐ ๋ณํ์ ๋ํด Push๋ฅผ ๋ฐ์๋ค๋ฉด, ์ด๋ฒ์๋ ์ ์ฒด collection ๋ด์์ ๋ณ๋์ด ์๊ธฐ๋ฉด push๋ฅผ ๋ฐ์ ๋ฟ, ์์ ์์ ํ ๋์ผํฉ๋๋ค. ๐๐
๋ค..๋ค๋ง... ํ๊ฐ์ง.. ์๊ณ ์์ผ๋ฉด ์ข์ ์ ์ด ์์ด์. ๋๊ฐ์ด snapshot.documents๋ก ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์.. Loop๋ฅผ ๋๋ฉด์ ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ ๋ญ๊ฐ Action์ ํ๊ธฐ์, ๋ณํ๊ฐ ์๋ ๋ฉ์ฉกํ data๋ค์ ๋ชจ๋ Loopํ๊ธฐ์ ๋๋ฌด ๋นํจ์จ์ ์ด์ฃ ๐ญ
๊ทธ๋์ ์ด๋๋ ๋ณํ๊ฐ ์ค์ ๋ก ๋ฐ์ํ document๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ด์. snapshot.documentChanges๋ฅผ ์ฌ์ฉํด์์!
let listener = db.collection("users").addSnapshotListener { (snapshot, error) in
if error == nil && snapshot != nil {
// ๋ณํ๊ฐ ์๋๊ฒ๋ง ๊ฐ์ ธ์ฌ ์ ์๋ค.
for change in snapshot!.documentChanges {
print(change.document.documentID)
}
} else {
// error. do something
}
}
Query
์ง๊ธ๊น์ง๋..ใ ใ ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด๋ดค๋๋ฐ์~! ํน์ ์กฐ๊ฑด์ ์ถ๊ฐํด์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ ์ถ์ผ๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น์?
SQL์ ์๋ก ๋ค๋ฉด SELECT, FROM์ ๋ชจ๋ ๋์ฃ ~~? ๊ทธ๋ฐ๋ฐ.. WHERE์ ์ ์ด๋ป๊ฒ ํ๋จ ๋ง์ธ๊ฐ.. ๐ญ
์ฌ๊ธฐ์๋ ๋์ผํ๊ฒ where์ ์กฐ๊ฑด์ ๋ฃ๋ ๊ฒ์ฒ๋ผ Query๋ฅผ ํ ์ ์๋ต๋๋ค. ๋ฐ๋ก whereField๋ฅผ ์ฌ์ฉํด์์~!
๋ฐ๋ก ์์๋ฅผ ๋ณด๋๋ก ํ ๊ป์~~
let query = db.collection("users").whereField("age", isEqualTo: 30)
query.getDocuments { (snapshot, error) in
let docs = snapshot!.documents
for doc in docs {
print(doc.documentID)
}
}
users collection ์์์ age๊ฐ 30์ธ๊ฒ๋ค์ document๋ค์ ๊ฐ์ ธ์๋ผ!
let query = db.collection("users").whereField("lastname", in: ["Harry", "chang"])
query.getDocuments { (snapshot, error) in
let docs = snapshot!.documents
for doc in docs {
print(doc.documentID)
}
}
users collection ์์์ lastname์ด in: [ ] ๋ฐฐ์ด ์์ ์๋ document๋ค์ ๊ฐ์ ธ์๋ผ!
let query = db.collection("users").whereField("pets", arrayContains: "dog")
query.getDocuments { (snapshot, error) in
let docs = snapshot!.documents
for doc in docs {
print(doc.documentID)
}
}
users collection ์์์ pets๋ผ๋ array์์ "dog"๊ฐ ์๋ document๋ค์ ๊ฐ์ ธ์๋ผ! (arrayContains๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ฐ๋์ Field์ ํ์ ์ด Array์ด์ด์ผ ๋์ํฉ๋๋ค!)
let query = db.collection("users").whereField("pets", arrayContainsAny: ["dog", "lion"]) // ์ด๊ฑฐ์ค ์๋ฌด๊ฑฐ๋ ์๋์ฌ๋.
query.getDocuments { (snapshot, error) in
let docs = snapshot!.documents
for doc in docs {
print(doc.documentID)
}
}
users collection ์์์ pets๋ผ๋ array์์ [ ] ์์ ์๋ ๊ฒ์ค ์๋ฌด๊ฑฐ๋ ๊ฐ์ง๊ณ ์๋ document๋ฅผ ๊ฐ์ ธ์๋ผ! (๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ๋์ Field์ ํ์ ์ด Array์ด์ด์ผ ๋์ํฉ๋๋ค!)
let query = db.collection("users").whereField("pets", arrayContainsAny: ["dog", "lion"]).whereField("age", isEqualTo: 30)
query.getDocuments { (snapshot, error) in
let docs = snapshot!.documents
for doc in docs {
print(doc.documentID)
}
}
์ด๋ ๊ฒ Query๋ฅผ ์ค์ฒฉํด์ ์ฌ์ฉํ ์๋ ์์ด์! users collection ์์์ pets๋ผ๋ array์์ [ ] ์์ ์๋ ๊ฒ์ค ์๋ฌด๊ฑฐ๋ ๊ฐ์ง๊ณ ์์ผ๋ฉด์ age๊ฐ 30์ธ document๋ค์ ๊ฐ์ ธ์๋ผ!
๊ฐ๋จํ Query๋ค๊น์ง ์ด์ง ์ดํด๋ณด์๋๋ฐ์~!
firestore๊ฐ Indexing๋ ์ง์ํด์ ๋น ๋ฅด๊ฒ ์ฟผ๋ฆฌ๋ฅผ ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ์ ์๋ ์ฅ์ ์ด ์๋ ๋ฐ๋ฉด์, ์ฝ๊ฐ ์์ฌ์ด ์ ๋ค๋ ์์ต๋๋ค.
- ์๋ฅผ ๋ค๋ฉด "!=" ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ์
- ์ค์ฒฉํด์ ์ฌ์ฉํ ๋ isLessThan, isGreaterThan ๋ฑ ํฌ๊ธฐ๋น๊ต ์ฐ์ฐ์ ํ๋์ ํ๋๊ฐ์ ๋ํด์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ์
- arrayContains, arrayContainsAny๋ ๋์์ ์ฌ์ฉํ ์ ์๋ค๋ ์
๋ํ์ ์ผ๋ก ์์ ๊ฐ์ง๋ง ์ค์ ๋ก๋ ์กฐ๊ธ ๋ ์์ด์.
firebase.google.com/docs/firestore/query-data/queries
์ง์ ์ค์ตํด๋ณด๋ฉฐ ๊ฐ๋จํ CRUD์ Query๋ฅผ ์ดํด๋ณด์๋๋ฐ์~!! ์ค์ ๋ก๋ ๋ค์ํ Query ์กฐ๊ฑด์ด ์๊ณ , ์ ๋ ฌ, ์ ํ์ฌํญ ๋ฑ๋ฑ ํ์ฅํด์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ด ์ ๋ง ๋ง๋ต๋๋ค!! ์์ ๊ณต์ ๊ฐ์ด๋๋ ๋งค์ฐ๋งค์ฐ ์ ์ ๋ฆฌ๋์ด ์์ผ๋, ์ฐธ๊ณ ํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค ๐
๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๊ณ ์ถ์๋๋ฐ ์๊ฐ๋ณด๋ค ๊ธด ํฌ์คํ ์ด ๋์๋ค์ ๐
์ธ์ ๊ฐ, ๋๊ตฐ๊ฐ์๊ฒ ๊ผญ ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋น ๐ค๐ค
'iOS [Swift] > ๊ธฐ์ด๋ฅผ ํํํ!' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Codable (0) | 2021.02.26 |
---|---|
[Swift] CodingKey (0) | 2021.02.26 |
[Swift] Cloud Firestore(1) ๋ฐ์ดํฐ ๊ตฌ์กฐ (1) | 2021.02.08 |
[Swift] ScrollView + PageControl (0) | 2021.02.05 |
[Swift] CGRect, CGSize, CGPoint (0) | 2021.02.05 |