Firestore更新后无需读取文档数据即可获取Field.increment的值

时间:2019-07-08 19:40:56

标签: firebase google-cloud-firestore

是否有一种方法可以检索使用firestore.FieldValue.increment更新的文档字段的更新值,而无需索取文档?

var countersRef = db.collection('system').doc('counters');

await countersRef.update({
    nextOrderCode: firebase.firestore.FieldValue.increment(1)
});

// Get the updated nextOrderCode without asking for the document data?

这与成本无关,但出于可靠性考虑。例如,如果我想创建一个为每个订单增加的代码,则无法保证如果同时发生>= 2个订单,如果我在文档更新解决后立即读取了增量值,则将具有不同的代码,因为如果>= 2写操作在第一次读取之前发生,那么即使nextOrderCode具有适当的递增量,也至少会有2个文档具有相同的代码。

3 个答案:

答案 0 :(得分:1)

不可能。如果想知道值,则必须在更新后阅读文档。

如果需要控制该数字的值以防止其无效,则必须使用事务来确保该增量不会写入无效的值。在这种情况下,FieldValue.increment()不是一个好的选择。

答案 1 :(得分:0)

我们可以使用Firestore Transactions来做到这一点,就像Field.increment功能之前的增量工作一样:

try {
  const orderCodesRef = admin.firestore().doc('system/counters/order/codes');
  let orderCode = null;
  await admin.firestore().runTransaction(async transaction => {
    const orderCodesDoc = await transaction.get(orderCodesRef);
    if(!orderCodesDoc.exists) {
      throw { reason: 'no-order-codes-doc' };
    }

    let { next } = orderCodesDoc.data();
    orderCode = next++;
    transaction.update(orderCodesRef, { next });
  });

  if(orderCode !== null) {
    newOrder.code = orderCode;
    const orderRef = await admin.firestore().collection('orders').add(newOrder);

    return success({ orderId: orderRef.id });
  } else {
    return fail('no-order-code-result');
  }
} catch(error) {
  console.error('commitOrder::ERROR', error);
  throw errors.CantWriteDatabase({ error });
}

答案 2 :(得分:0)

有同样的问题,看起来像 Firestore Python 客户端 doc_ref.update() 返回 WriteResult 具有 transform_results 属性和更新的字段值