从documentation的Firestore批量写入和事务中,我了解了什么,如果误解了,请纠正我,该事务原子文档是在读取之后写入的,因此所有读取操作必须在在事务内部写入。
但是我的问题是可以写入实时数据库而不是firestore吗?
例如,拿文档内部的摘录,是否将Firestore更新(写入)替换为城市文档人口计数器,而将Firebase设置(写入)替换为/populations/counter
工作?
// Initialize document
var cityRef = firestore.collection('cities').doc('SF');
var setCity = cityRef.set({
name: 'San Francisco',
state: 'CA',
country: 'USA',
capital: false,
population: 860000
});
var transaction = firestore.runTransaction(t => {
return t.get(cityRef)
.then(doc => {
// Add one person to the city population
var newPopulation = doc.data().population + 1;
// ***** DOCUMENTATION WRITE OPERATION*****
// t.update(cityRef, {population: newPopulation});
// ***** CODE IN QUESTION *****
realtimeDatabase().ref('/counters/population').set(newPopulation)
});
}).then(result => {
console.log('Transaction success!');
}).catch(err => {
console.log('Transaction failure:', err);
});
答案 0 :(得分:1)
在多用户环境中使用数据时,可用数据可能会因并发修改(例如增量计数器)而损坏。在这种情况下,要获得一致的数据,应使用事务操作。在Cloud Firestore中,当您要基于字段的当前值更新时,交易非常有用。您可以通过创建一个事务来增加计数器的数量,该事务读取该计数器的当前值,对其进行递增,然后将新值写回Cloud Firestore。
如果您在文档中读取了属性的值,并且没有在事务操作中更新它,则意味着它不再是事务操作。如果您读取该值而不是对其进行更新,则只需将其设置在另一个位置即可,这意味着您应该执行读取和写入操作,而不进行更新,而应该使用事务操作。因此,无论您将新值写入Firebase实时数据库还是Cloud Firestore中的另一个位置都没有关系,此操作不能称为事务。
还请记住,每种产品都有其自己的交易机制。这里是Firebase realtime database transactions,这里是Cloud Firestore transactions。
但是我的问题是可以写入实时数据库而不是firestore吗?
是的,但是现在不再是交易操作。
是否将Firestore更新(写入)到城市文档人口计数器,而将Firebase设置(写入)到/ populations / counter工作?
是的,它可以工作,但仅被视为读/写操作。
如果您只想读取一个数字并将其设置在其他位置,则无需进行强制制裁。