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