如何使用firebase firestore有效地将项目添加到集合中

时间:2017-10-17 17:25:17

标签: javascript firebase google-cloud-firestore

我想要添加到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)
    })
}

2 个答案:

答案 0 :(得分:11)

Cloud 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();
    })
}

答案 1 :(得分:4)

如果要向集合中添加多个文档,则可以执行类似的操作,因为我被困在类似的情况下,因此对我来说效果很好。

let colRef = db.collection('cars')

/// Batch Thing //
var batch = db.batch();

let cars = [{name: 'Audi', model: 'A8'}, {name: 'BMW', model: '730'}]
cars.forEach(c => {
  let ref = colRef.doc(`${c.name}`)
  batch.set(ref, {
    name: `${c.name}`,
    model: `${c.model}`
  })
})

return batch.commit()
  .then(data => {
    console.log('good')
  })
  .catch(error => {
    console.log('there is an error')
  })