2017-10-17 71 views
2

我有一個標籤,我想添加到一個firestore集合數組。如何有效地將項目添加到與firebase firestore收集

如果我沒有誤解我在這裏的方法,我想我會對該集合進行個別添加,因爲我認爲將它們「分組」並將它們一次全部設置會更有效。是這樣的可能嗎?也可以同時將文檔添加到鍛鍊集合中嗎?

現在我正在查看tags.length + 1爲每次調用此函數時寫入firebase。我想盡可能地減少它。

logWorkoutAsync({ userId, timeStamp, tags }){ 
    var db = this.firebase.firestore(); 

    return db.collection('users').doc(userId).collection('workouts').add({ 
     timeStamp, 
     'class': false 
    }).then(doc => { 

     var tagsCollection = doc.collection('tags') 

     var promises = [] 

     tags.forEach(t => { 
      promises.push(tagsCollection.doc(t.id.toString()).set(t)) 
     }) 

     return Promise.all(promises) 
    }) 
} 

回答

3

雲公司的FireStore有成批寫入的支持,看到這裏的文檔: https://firebase.google.com/docs/firestore/manage-data/transactions

所以你可以做這樣的事情:

logWorkoutAsync({ userId, timeStamp, tags }){ 
    var db = this.firebase.firestore(); 

    return db.collection('users').doc(userId).collection('workouts').add({ 
     timeStamp, 
     'class': false 
    }).then(doc => { 

     var tagsCollection = doc.collection('tags'); 

     // Begin a new batch 
     var batch = db.batch(); 

     // Set each document, as part of the batch 
     tags.forEach(t => { 
      var ref = tagsCollection.doc(t.id.toString()); 
      batch.set(ref, t); 
     }) 

     // Commit the entire batch 
     return batch.commit(); 
    }) 
} 
+0

哇!這太棒了!我是否也可以在批處理中包含最初的.add?也許如果我做一些像batch.set(db.collection('users')。doc(userId).collection('workouts')。doc(timeStamp.toString),{timeStamp,'class':false})?在這種情況下,我只需要提供一個'id',對吧? – Robodude

+0

是的,你絕對可以做到這一點!您最多可以在一批中添加500個操作。你的直覺是正確的,爲了得到'batch.add()',你需要在其他地方執行'.doc()'來創建引用,然後在該引用上調用'batch.set()'。 –

+0

@hatboysam如果我們想在單個批次中編寫500多個操作,我們可以做些什麼?可以連接多次?我的意思是,有兩個批次,一個有500個操作,另一個有250個,等等。 –

相關問題