我们可以不查询交易内的集合吗?

时间:2018-04-28 00:22:54

标签: firebase google-cloud-firestore

查看https://firebase.google.com/docs/reference/js/firebase.firestore.Transaction我看到了四种方法:删除,设置,获取,更新。

我打算构建一个可爱的小集合查询并将其传递给.get,但我看到文档说.get“读取提供的 DocumentReference 引用的文档。”

看来这意味着我们无法使用Transaction对象获取集合或查询集合。

可以查询那些使用查询的.get()方法而不是事务的.get()方法,但是如果集合从我下面更改,那么事务将以不一致的方式结束没有重试的状态。

我好像在这里撞墙了。我的理解是否正确?我们不能以一致的方式访问事务中的集合吗?

4 个答案:

答案 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)

我所做的是(toawait-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)
));