2017-10-17 4 views
1

Je souhaite effectuer une transaction par lot dans un magasin de sapeurs-pompiers. Je stocke la dernière clé dans une autre collection. J'ai besoin d'obtenir la dernière clé puis augmenter de 1, puis créer deux documents en utilisant cette clé. Comment puis-je faire ceci?Comment obtenir une donnée de firestore en utilisant batch?

let lastDealKeyRef = this.db.collection('counters').doc('dealCounter') 
let dealsRef = this.db.collection('deals').doc(id) 
let lastDealKey = batch.get(lastDealKeyRef) // here is the problem.. 
batch.set(dealsRef, dealData) 
let contentRef = this.db.collection('contents').doc('deal' + id) 
batch.set(contentRef, {'html': '<p>Hello World</p>' + lastDealKey }) 
batch.commit().then(function() { 
console.log('done') }) 

Répondre

3

Si vous souhaitez lire/écrire des données en une seule opération, vous devez utiliser une transaction.

// Set up all references 
let lastDealKeyRef = this.db.collection('counters').doc('dealCounter'); 
let dealsRef = this.db.collection('deals').doc(id); 
let contentRef = this.db.collection('contents').doc('deal' + id); 


// Begin a transaction 
db.runTransaction(function(transaction) { 
    // Get the data you want to read 
    return transaction.get(lastDealKeyRef).then(function(lastDealDoc) { 
     let lastDealData = lastDealDoc.data(); 

     // Set all data 
     let setDeals = transaction.set(dealsRef, dealData); 
     let setContent = transaction.set(contentRef, {'html': '<p>Hello World</p>' + lastDealKey }); 

     // Return a promise 
     return Promise.all([setDeals, setContent]); 

    }); 
}).then(function() { 
    console.log("Transaction success."); 
}).catch(function(err) { 
    console.error("Transaction failure: " + err); 
}); 

Vous pouvez en savoir plus sur les transactions et les lots ici: https://firebase.google.com/docs/firestore/manage-data/transactions

+0

Cependant, avec une mise en garde - les transactions sont actuellement pas prises en charge hors ligne, ce qui, je l'espère changer à l'avenir :) –