查看https://firebase.google.com/docs/reference/js/firebase.firestore.Transaction我看到了四种方法:删除,设置,获取,更新。
我打算构建一个可爱的小集合查询并将其传递给.get,但我看到文档说.get“读取提供的 DocumentReference 引用的文档。”
看来这意味着我们无法使用Transaction对象获取集合或查询集合。
我可以查询那些使用查询的.get()方法而不是事务的.get()方法,但是如果集合从我下面更改,那么事务将以不一致的方式结束没有重试的状态。
我好像在这里撞墙了。我的理解是否正确?我们不能以一致的方式访问事务中的集合吗?
答案 0 :(得分:3)
您的理解是正确的。您必须确定您希望确保在交易完成前不会更改的单个文档。如果这些文件提前来自集合查询,那很好。但是想一想,如果你必须跟踪(非常大)的集合中的每个文档以完成交易,那将是多么不可扩展。
答案 1 :(得分:3)
您可以在事务的 get()
方法中运行查询(不仅仅是获取单个文档),但这仅适用于服务器执行。因此,如果您确实需要这样做(例如维护非规范化数据的一致性),您可以将该代码放入云函数中并利用服务器端事务
答案 2 :(得分:0)
我不明白。 这个代码可以吗?我看不到其他方法:
admin.firestore().runTransaction(async t => {
const query = admin
.firestore()
.collection('coll')
.where('x', '==', true);
const results = await query.get(); //this line is crucial
results.forEach(r => t.update(r, ...)});
? 有人说只要有人写集合,事务就会再次运行
答案 3 :(得分:0)
我所做的是(to
为await-to-js
):
const [getInvestmentError, getInvestmentSuccess] = await to(db.collection('investments')
.where('userId', '==', uid)
.where('assetId', '==', assetId)
.get()
);
然后:
const [readInvestmentError, readInvestment] = await to(transaction.get(
db.collection('investments').doc(getInvestmentSuccess.docs[0].id)
));