简体   繁体   中英

Firestore - How Can I Use UpdateDoc in Loop?

I need to decrement some values of product's count when user orders, I use updateDoc() in loop but it throws

Error: Expected type 'af', but it was: a custom fg object

在此处输入图像描述

const app = initializeApp(firebaseConfig);
const db = getFirestore(app);

let docs = [doc(db, "myCollection", 'a'), doc(db, "myCollection", 'b')];

async function test() {
  for (let i = 0; i < 2; i++) {
    let doc = await getDoc(docs[i]);
    console.log(doc.data());
    await updateDoc(doc, {
      num: increment(-1)
    })
  }
}

test();

在此处输入图像描述 How can I do that?

The updateDoc() function takes a DocumentReference as the first parameter and not a DocumentSnapshot . Also you don't have to fetch the document before updating in this case. Try:

let docs = [doc(db, "myCollection", 'a'), doc(db, "myCollection", 'b')];

async function test() {
  for (let i = 0; i < 2; i++) {
    // doc in original code is a DocumentSnapshot
    // docs[i] is a DocumentReference
    await updateDoc(docs[i], {
      num: increment(-1)
    })
  }
}

You can use Promise.all() to run all the promises simultaneously as shown below:

let docs = ["a", "b"];

async function test() {
  const promises = docs.map((d) => {
    return updateDoc(doc(db, "myCollection", "b"), {
      num: increment(-1)
    })
  })
  await Promise.all(promises)
}

If you want to ensure that all updates are successful or none, then also checkout Batched Writes .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM