v7ããªãªã¼ã¹ããã®ã§æ¹ãã¦firestore-simpleãç´¹ä»ãã¾ã
firestore-simpleã®éå»ã®ã¨ã³ããª
- Firestoreããã£ã¨æè»½ã«ä½¿ããfirestore-simpleãä½ã£ã
- Firestoreããã£ã¨æè»½ã«ä½¿ããfirestore-simpleããã¼ã¸ã§ã³2ã«ãªãã¾ãã
- TypeScriptããFirestoreã使ããããããfirestore-simple v4ããªãªã¼ã¹ãã¾ãã
- firestore-simple v5ããªãªã¼ã¹ãã¾ãã
以åããä½ãç¶ãã¦ãããFirestoreã使ããããããããã®ã©ããã¼ã§ããfirestore-simpleãv7ã«ãªãã¾ãã ð ï¼v6ã¯äºå®ä¸ã®æ¬ çªæ±ãï¼
v7ã§ä»¥åããå®ç¾ãããã£ãjsã®web SDKã«å¯¾å¿ã§ãã¾ãããadmin/web SDKã®ä¸¡æ¹ã«å¯¾å¿ã§ããã®ã¯1ã¤ã®ç¯ç®ã ã¨æãã¦ããã®ã§ãä»åã®ä¿®æ£ç¹ã«å ãã¦ãããããã®firestore-simpleã®ã³ã³ã»ãããåç´¹ä»ãããã¨æãã¾ãã
BREAKING CHANGES
ããã±ã¼ã¸ãä»ã¾ã§ã®firestore-simpleãããadmin SDKç¨ã®@firestore-simple/adminã¨web SDKç¨ã®@firestore-simple/webã¨2ã¤ã«å¥ãã¾ãããä»ã¾ã§ã®firestore-simpleã¯ããã§DEPRECATEDã«ãªãã¾ãã
ããv6ã¾ã§ã®firestore-simpleãã使ãã ã£ãæ¹ã¯ ã以ä¸ã®ããã«ãã¤ã°ã¬ã¼ã·ã§ã³ããé¡ããã¾ãã
npm install @firestore-simple/admin
// old import { FirestoreSimple } from 'firestore-simple' // new import { FirestoreSimple } from '@firestore-simple/admin'
è¿½å æ©è½
firestore-simpleã¯ä»ã¾ã§admin SDKãã対å¿ãã¦ããªãã£ãã®ã§ãããv7ããweb SDKã«ã対å¿ãã¾ãããããã§admin SDKã使ã£ã¦Firestoreã使ããµã¼ãã¼ãCloud Functionsç°å¢ã«å ãã¦ãã¯ã©ã¤ã¢ã³ãããFirestoreã«ã¢ã¯ã»ã¹ããã³ã¼ãã§ãfirestore-simpleã使ããã¨ãã§ããããã«ãªãã¾ããã
ã¤ã³ã¹ãã¼ã«ã¨importã¯ä»¥ä¸ã®ããã«ãªãã¾ãã
npm install @firestore-simple/web
import { FirestoreSimple } from '@firestore-simple/web'
exampleãè¦ã¦ããããã¨åããã®ã§ãããweb SDKã®æ¹ãAPIã¯åºæ¬çã«ä»ã¾ã§ã®admin SDKç¨ã®firestore-simpleã¨å ¨ãä¸ç·ã«ãªã£ã¦ãã¾ãã
ãã ããweb SDKã®ä¸é¨ã®ã¡ã½ãããæã¤admin SDKã«ã¯åå¨ããªããªãã·ã§ã³ã«ã¾ã 対å¿ã§ãã¦ããªãã¨ãããããã¾ããä¾ãã°get()
ãåãåããGetOptionsãªã©ã§ãããããã¯ä»å¾å¯¾å¿ãã¦ããäºå®ã§ãã
æ¹ãã¦firstore-simpleã®æ©è½ç´¹ä»
ããã¾ã§ç´°ã ã¨ç´2å¹´ã»ã©ä½ãç¶ãã¦ããã®ã§ãv1ããæ¯ã¹ãã¨jsããTypeScriptãã¼ã¹ã«å¤æ´ãããã¨ãããæã®ã³ã¼ãã¯å ¨ã¦ç½®ãæããã¾ãããã§ãããFirestoreãããjsããæ±ãããããããã¨ããã³ã³ã»ããã¯å¤ãã£ã¦ãã¾ããã
v1ããæ¯ã¹ãã¨ã¢ãã¼ã«ããããã¤ã³ããããã¤ãå¤ããã¾ããã®ã§ãæ¹ãã¦firestore-simpleã®ä»£è¡¨çãªç¹å¾´ãç´¹ä»ãã¾ãã
ãã¼ã¿ã®åå¾ã¨æ´æ°ãç°¡æ½ã«
ç´ ã®Firestoreã§1ã¤ã®ããã¥ã¡ã³ãã追å ãããããã¼ã¿ãåå¾ããå ´åããã®ãããªã³ã¼ãã«ãªãã¾ãã
const id = await firestore.collection('users').add({ userId: 'alice' }) const doc = await firestore.collection('users').doc(id).get() const data = doc.data()
æ£ç´ã1ã¤ã®ããã¥ã¡ã³ãã追å ããããåå¾ããããã«æ¯åãã®ã³ã¼ããæ¸ãã®ã¯é¢åãããã¨æãã¦ãã¾ããå ãã¦ãæ¯åcollectionãæå®ããå¿ è¦ãããããã³ã¬ã¯ã·ã§ã³åãtypoãã¦ãã¾ãã ãã§å®¹æã«ãã°ã¨ãªãã¾ãã
ããã«ããã®çãã³ã¼ãã®ä¸ã ãã§CollectionReference, DocumentReference, DocumentSnapshotã¨ãã3ã¤ã®Firestoreã®ã¯ã©ã¹ãç»å ´ãã¦ãããæ
£ããã¾ã§ã¯è¤éã«æããã§ããããã¡ãªã¿ã«ãdata()
ã®ã¡ã½ãããæã£ã¦ããã®ã¯DocumentSnapshotã§ããã
ãããã«å¯¾ãã¦èªåãåæã«åã£ãã¢ããã¼ãã¯ã以ä¸ã®ããã«ã³ã¬ã¯ã·ã§ã³æ¯ã«ã©ããã¼ã¯ã©ã¹ãä½ã£ã¦ã¡ã½ãã1ã¤ã§ãã¼ã¿ãåå¾ã§ããããã«ãã¦ãã¾ããã
class UserCollection { constructor() { this.collection = firestore.collection('users') } async fetch(userId) { const docRef = await this.collection.doc(userId).get() return docRef.data() } } const userCollection = new UserCollection() const user = await userCollection.fetch('alice') // id='alice'ãæ¸¡ãã ã
ãã®ãããªã¯ã©ã¹ãèªåã§ç¨æããã¨ãCollectionReference, DocumentReference, DocumentSnapshotã®åºå¥ãæèãããã¨ãªããåç´ã«documentã®idã ããæ¸¡ãã¦ä¸ã®ãã¼ã¿ãåå¾ãããã¨ãå¯è½ã«ãªãã¾ããå®ã«ã·ã³ãã«ã§ãã
firestore-simpleã¯ã¾ãã«ãããæ±ç¨åãããã®ã§ããããã®ãããªã¯ã©ã¹ãã³ã¬ã¯ã·ã§ã³æ¯ã«èªä½ããå¿ è¦ããªããªãã¾ããå è¿°ã®ã³ã¼ãã¨åçã®æ©è½ã¯firestore-simpleã ã¨ãã®ããã«ãªãã¾ãã
const firestoreSimple = new FirestoreSimple(firestore) const userCollection = firestoreSimple.collection<User>({ path: 'users' }) const id = await userCollection.add({ userId: 'alice' }) const user = await userCollection.fetch(id)
ActiveRecord風ã§ã¯ã¯ãªã
Firestoreã«éããDBã®ORMã§ããè¦ãã®ã¯ActiveRecordã®ãã¿ã¼ã³ã ã¨æãã¾ããæ¬ä¼¼ã³ã¼ãã§ããã以ä¸ã®ãããªã¤ã¡ã¼ã¸ã§ãã
const user = new User({ userId: 'alice' }) user.age = 20 await user.save() // ããã§DBã«æ¸ãè¾¼ã¾ãã const alice = await User.find({ userId: 'alice') // DBãããã¼ã¿åå¾
ä»ã©ãã§ã¯é常ã«ãããµããORM風ã®APIã§ãããfirestore-simpleã§ã¯2ã¤ã®çç±ããããã¦ãã®ãããªAPIã«ã¯ãã¦ãã¾ããã
1ã¤ç®ã¯åç´ã«ç´ ã®Firestoreã®APIããé¢ããããªãããã«ãããã£ãããã§ããç´ ã®Firestoreããä½¿ãæ¹ãé¢ãããã¦ãã¾ãã¨ä½ãåé¡ãèµ·ããå ´åã«ã³ã¼ãã追ãã«ãããªã£ã¦ãã¾ããããããã¾ã§èãã©ããã¼ã¨ãªãããã«æèãã¦ãã¾ãã
2ã¤ç®ã¯ãjsçéã«ããã¦ã¯ä½ãå¤ãå
¥ãã¦ããå
¥ãç©ã¨ãã¦ãåãªãObjectï¼{ foo: bar}
ã®ãããªå½¢ï¼ã好ã¾ãã¦ããã¨æãã¦ããããã§ããTypeScriptãããã«ãã®åãªãObjectã«å¯¾ãã¦åãä»ãã¦æ±ãããã¨ããç¹ãéè¦ãã¦ããè¨èªã§ããActiveRecordãã¿ã¼ã³ã¯ã¯ã©ã¹ã¨ã¤ã³ã¹ã¿ã³ã¹ã«ãã£ã¦å®ç¾ããããã®ã§ããããã®ææ³ã¨çéã§ããããfirestore-simpleã§ã¯ãã®ãããªAPIãæä¾ãã¦ãã¾ããã
å¼·åãªåæ¨è«ã¨è£å®
Firestoreã®å¾®å¦ãªç¹ã¨ãã¦ãTypeScriptã§ä½¿ãã¨ãã«CollectionReferenceãDocumentReferenceãªã©ã®Firestoreèªä½ã«ã¯åãä»ãã¦ãã¾ãããåå¾ãã¦ããããã¥ã¡ã³ãã«ã¯åãä¸åä»ãã¦ãã¾ãããã»ã¨ãã©ã®æ¹ã¯doc.data() as User
ãªã©ã¨èªåã§åãä»ãã¦ããã®ã§ã¯ãªãã§ããããã
firestore-simpleã§ã¯ã³ã¬ã¯ã·ã§ã³ãå®ç¾©ããã¨ãã«ããã¥ã¡ã³ãã®åãæ¸¡ããã¨ã§ãfetch()
ããããã¥ã¡ã³ãèªåçã«åãä»ãã¾ãããadd()
ãªã©ã®æ´æ°ç³»ã¡ã½ãããåãæ£ããããã§ãã¯ãã¦ããã¾ãã
const userCollection = firestoreSimple.collection<User>({ path: 'users' }) const user = await userCollection.fetch(id) // userã¯èªåçã«Useråã¨ãªã
å®ã¯ãæ¨å¹´Firestoreã«è¿½å ãããwithConverter()
ã使ããã¨ã§ãç´ ã®Firestoreã§ãèªåçã«åãä»ãããã«ãªãã¾ããã
firestore-simpleã¯ããã«å ãã¦åæ
å ±ãå©ç¨ããè£å®ãå¼·åã§ãããwhere()
ãupdate()
ãããã¥ã¡ã³ãã®ãã¼ãè£å®ãã¦ããã¾ããããã«ã¤ãã¦ã¯v4ããªãªã¼ã¹ããã¨ãã®è¨äºã詳ããã®ã§èå³ããã人ã¯è¦ã¦ã¿ã¦ãã ãããã©ã®ããã«è£å®ãããã®ããv4ã®è¨äºããGIFåç»ãã¡ãã«ãè²¼ã£ã¦ããã¾ãã
batchç³»ã®APIã®ä½¿ãåæãåä¸
ããã«ç´ ã®Firestoreã®å¾®å¦ãªç¹ã¨ãã¦ãTransactionãBatchã®APIã®ä½¿ãåæã®æªããæãããã¾ãã
é常ã¯documentReference.get()
ãªã¨ãããTransactionã®ä¸ã§ã¯transaction.get(documentReference)
ã¨APIãå¥ç©ã«ãªã£ã¦ãã¾ã£ã¦ããã®ã§ããããã¯Batchã®æ¹ã§ãåæ§ã§ãã
ããã«ããããããªããTransactionã¨Batchã§ä½¿ãæ¹ãå ¨ãç°ãªã£ã¦ãã¾ãã
// ç´ ã®Firestoreã使ã£ãã³ã¼ã firestore.runTransaction(async(tx) => { // Transactionå ã§ã®å¦ç } const batch = firestore.batch() // set(), update()ãªã©batchã§ã¾ã¨ãã¦è¡ãããå¦ç await batch.commit()
firestore-simpleã§ã¯batchãTransactionã¨åã使ãåæãå®ç¾ããrunBatch()
ã¨ããã¡ã½ãããç¬èªã«è¿½å ãã¾ããã
// FirestoreSimpleã使ã£ãã³ã¼ã await firestoreSimple.runBatch(async (_batch) => { await userCollection.set({ userId: 'alice' }) }) // <- runBatchãæããã¿ã¤ãã³ã°ã§èªåçã«batch.commit()ããã
ãæ°ã¥ãããããã¾ããããç´ ã®Firestoreã§ããã°batch.set()
ã¨æ¸ãå¿
è¦ãããã¨ããããé常éãã®set()
ã®å¼ã³åºãæ¹ã§OKã§ããfirestore-simpleã使ã£ãã¨ãã®runTransaction()
ãåæ§ã®æåã¨ãªãããã«æ¹è¯ãã¦ãã¾ããéå¸¸ç¶æ
ãTransactionå
ãBatchå
ã®ããããã®ç¶æ
ã«å¿ãã¦firestore-simpleãã¡ã½ãããè£ã§å¼ã³åãã¦ãã®ãããªé è½ãå®ç¾ãã¦ãã¾ãã
ããã«ãåã«1ã¤ã®ã³ã¬ã¯ã·ã§ã³ã«å¯¾ãã¦é
åã§ã¾ã¨ãã¦add
, set
ãããã ãã¨ããã¦ã¼ã¹ã±ã¼ã¹ã«ä¾¿å©ãªbulkAdd()
, bulkSet()
ãç¨æãã¾ãããéã«idã®é
åãæ¸¡ãã¨è¤æ°ã®ããã¥ã¡ã³ããã¾ã¨ãã¦åé¤ãã¦ãããbulkDelete()
ãããã¾ãã
await userCollection.bulkAdd([ { userId: 'alice' }, { userId: 'bob' }, ]) await userCollection.bulkSet([ { id: '1', userId: 'alice' }, { id: '2', userId: 'bob' }, ]) await dao.bulkDelete(['1', '2'])
TransactionãBatchã«ã¤ãã¦ã¯v5ããªãªã¼ã¹ããã¨ãã®è¨äºããµã³ãã«ã³ã¼ãã«ããå°ã詳ããå 容ãããã¾ãã®ã§ãæ°ã«ãªã£ãæ¹ã¯ãã²è¦ã¦ã¿ã¦ãã ããã
ãã¹ãã¯Firestoreã®ã¨ãã¥ã¬ã¼ã¿ã使ç¨
v6ã¾ã§ã¯ãã¹ããå®è¡ããã¨ãã«æ¬ç©ã®Firestoreã使ç¨ãã¦ãã¾ããããv7ã§web SDKã¨admin SDKã®ä¸¡æ¹ã§ã¨ãã¥ã¬ã¼ã¿ã使ç¨ããããã«å¤æ´ãã¾ãããæ¬ç©ã®Firestoreã§ã¯ç¹ã«onSnapshotç³»ã®ãã¹ãã®ä¸å®å®ãã«æ©ã¾ããã¦ãã¾ããããã¨ãã¥ã¬ã¼ã¿ã使ããã¨ã§ã ãã¶ãã¹ããå®å®ãã¾ããã
ã¨ãã¥ã¬ã¼ã¿ã«ãããã¹ãã¸ã®ç½®ãæãã¯ãCIã§ã®å®è¡æ¹æ³ãå«ãã¦ããã¤ãã¯ã¼ã¯ã¢ã©ã¦ã³ããªå¯¾å¿ãå¿
è¦ã ã£ãã®ã§è¦å´ãã¾ãããFirestoreã®ã¨ãã¥ã¬ã¼ã¿ã使ã£ããã¹ãã«èå³ãããæ¹ã¯GitHubã§å
¬éããã¦ããã³ã¼ãã®package.json
ã__tests__/util.ts
ãªã©ãåèã«ãªãã¨æãã¾ãã
ä»å¾ã®å±æ
v7ã§è¿½å ããweb SDKãã»ã¨ãã©ã®æ©è½ã¯å¯¾å¿æ¸ã¿ã§ãããåé ã®æ¹ã§æ¸ããããã«ä¸é¨ã®ã¡ã½ããã§admin SDKã«ã¯åå¨ããªãã£ããªãã·ã§ã³ãæªå¯¾å¿ãªã®ã§ã次ã®ãã¼ã¸ã§ã³ã§ã¯ãããå©ç¨å¯è½ã«ãã¾ãã
æ¬å®¶Firestoreãä½ãããæ°æ©è½ãçºè¡¨ããããããã対å¿ãã¦ããããã¨èãã¦ãã¾ãããããããåã ããæ¬²ããã¨æã£ã¦ããAPIããã¥ã¡ã³ããæ´åãã¦ããããã¨æã£ã¦ãã¾ããTypeScriptãªãããæãã®ããã¥ã¡ã³ããèªåçæã§ããã¯ãã»ã»ã»ï¼
FirestoreãFirebaseèªä½ãã¾ã ã¾ã é²åã®ã¹ãã¼ããè½ã¡ã¦ããªããããfirestore-simpleãå¼ãç¶ãéçºã»ã¡ã³ãããã¦ããäºå®ã§ããfirestore-simpleããã²ä½¿ã£ã¦ã¿ã¦ãã ããï¼