节点js Firestore事务中的多个文档读取
Multiple document reads in node js Firestore transaction
我想执行一个事务,需要使用这些文档的先前值更新两个文档。
为了这个问题,我正在尝试将 100 个令牌从一个应用程序用户转移到另一个应用程序用户。此操作必须是原子的以保持我的数据库的数据完整性,所以在服务器端我虽然使用 admin.firestore().runTransaction
.
据我了解runTransaction
需要在执行写入之前执行所有读取,那么如何在更新数据之前读取两个用户的余额?
这是我目前拥有的:
db = admin.firestore();
const user1Ref = db.collection('users').doc(user1Id);
const user2Ref = db.collection('users').doc(user2Id);
transaction = db.runTransaction(t => {
return t.get(user1Ref).then(user1Snap => {
const user1Balance = user1Snap.data().balance;
// Somehow get the second user's balance (user2Balance)
t.update(user1Ref , {balance: user1Balance - 100});
t.update(user2Ref , {balance: user2Balance + 100});
return Promise.resolve('Transferred 100 tokens from ' + user1Id + ' to ' + user2Id);
});
}).then(result => {
console.log('Transaction success', result);
});
您可以使用 Promise.all()
生成单个承诺,当传递给它的数组中的所有承诺都已解决时,该承诺将解决。在所有文档读取完成后使用该承诺继续工作——它将包含所有结果。你的代码的一般形式应该是这样的:
const p1 = t.get(user1Ref)
const p2 = t.get(user2Ref)
const pAll = Promise.all([p1, p2])
pAll.then(results => {
snap1 = results[0]
snap2 = results[1]
// work with snap1 and snap2 here, make updates to refs...
})
您可以使用 getAll
。请参阅 https://cloud.google.com/nodejs/docs/reference/firestore/0.15.x/Transaction?authuser=0#getAll
上的文档
我想执行一个事务,需要使用这些文档的先前值更新两个文档。
为了这个问题,我正在尝试将 100 个令牌从一个应用程序用户转移到另一个应用程序用户。此操作必须是原子的以保持我的数据库的数据完整性,所以在服务器端我虽然使用 admin.firestore().runTransaction
.
据我了解runTransaction
需要在执行写入之前执行所有读取,那么如何在更新数据之前读取两个用户的余额?
这是我目前拥有的:
db = admin.firestore();
const user1Ref = db.collection('users').doc(user1Id);
const user2Ref = db.collection('users').doc(user2Id);
transaction = db.runTransaction(t => {
return t.get(user1Ref).then(user1Snap => {
const user1Balance = user1Snap.data().balance;
// Somehow get the second user's balance (user2Balance)
t.update(user1Ref , {balance: user1Balance - 100});
t.update(user2Ref , {balance: user2Balance + 100});
return Promise.resolve('Transferred 100 tokens from ' + user1Id + ' to ' + user2Id);
});
}).then(result => {
console.log('Transaction success', result);
});
您可以使用 Promise.all()
生成单个承诺,当传递给它的数组中的所有承诺都已解决时,该承诺将解决。在所有文档读取完成后使用该承诺继续工作——它将包含所有结果。你的代码的一般形式应该是这样的:
const p1 = t.get(user1Ref)
const p2 = t.get(user2Ref)
const pAll = Promise.all([p1, p2])
pAll.then(results => {
snap1 = results[0]
snap2 = results[1]
// work with snap1 and snap2 here, make updates to refs...
})
您可以使用 getAll
。请参阅 https://cloud.google.com/nodejs/docs/reference/firestore/0.15.x/Transaction?authuser=0#getAll