【问题标题】:Way to query and update data in Firestore在 Firestore 中查询和更新数据的方法
【发布时间】:2020-05-11 20:50:48
【问题描述】:

我使用 Stripe 运行支付系统,并尝试在每次成功购买后减少 Firestore 中的数量字段。我可以获得该文档,但我正在努力弄清楚如何更新它。

db.collection('products').where('id', '==', dbRef).get()
    .then(querySnapshot => {
        return querySnapshot.forEach(doc => {
            return res.json({
                data: doc.data(),
                err: err
            })
        })
    })
{
  "data": {
    "stripe": {
      "sku": "sku_xxx",
      "product": "prod_xxx"
    },
    "name": "VERSA HOODIE",
    "id": "pmz0pvfa",
    "createdBy": "Q3Vn0LLRnSWzxaeOK7V0UYbuiKF2",
    "price": "25.00",
    "quantity": 10,
    "inStock": true,
    "description": "TEST PRODUCT",
    "imageURL": "https://xxx"
  },
  "err": null
}

我尝试了doc.update({}) 之类的东西,但它不起作用... 提前致谢

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    (如果您的查询始终返回一个且仅一个文档,请参见下文)


    要更新一个查询返回的所有文档,需要调用DocumentReferencesupdate()方法,如下:

    db.collection('products').where('id', '==', dbRef).get()
        .then(querySnapshot => {
            querySnapshot.forEach(doc => {
                const docRef = doc.ref;
                docRef.update({...});
            })
        })
    

    如果您想知道所有更新何时完成,并可能在承诺链中添加另一个异步方法调用,您应该使用Promise.all(),如下所示:

    db.collection('products').where('id', '==', dbRef).get()
        .then(querySnapshot => {
            const promises = [];
            querySnapshot.forEach(doc => {
                const docRef = doc.ref;
                promises.push(docRef.update({...}));
            })
            return Promise.all(promises);
        })
        .then(...)
    

    请注意,如果您确定要完成的更新少于 500 个,则可以使用一组 batched writes


    如果您知道查询对应的文档只有一个,只需执行以下操作:

    db.collection('products').where('id', '==', dbRef).get()
        .then(querySnapshot => {
            const docRef = querySnapshot.docs[0].ref;
            return docRef.update({...});
        })
    

    最后请注意,如果你想在 Firestore 中增加或减少一个字段,你应该使用FieldValue.increment()

    【讨论】:

    • 一个问题,我试过quantity: admin.firestore().FieldValue.increment(-1)。我查看了文档,但不是很清楚。这是正确的吗?
    • 这取决于:您使用的是管理 SDK 还是客户端 SDK?
    • 我正在使用管理 SDK
    • 如果您使用的是Admin SDK,请执行以下操作:const FieldValue = require('firebase-admin').firestore.FieldValue; ... quantity: FieldValue.increment(-1);
    猜你喜欢
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2019-04-22
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多