是否有一种方法可以检索使用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个文档具有相同的代码。
答案 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
属性和更新的字段值