Firestore事务在单个事务中更新多个文档

时间:2017-11-28 13:24:21

标签: javascript firebase google-cloud-firestore

如何通过使用我搜索的单个事务更新firestore中的多个文档,但我没有得到任何答案。是否可以在单个交易中更新多个文档?我知道可以通过批量写入来完成。

4 个答案:

答案 0 :(得分:5)

我发现我们可以在事务中使用多个引用:

var userSuhail = db.collection("users").doc("suhail");
var userSam = db.collection("users").doc("sam");
var userJohn = db.collection("users").doc("john");
var userAlfred = db.collection("users").doc("Alfred");
var userAlfredDetails = db.collection('userdetails').doc('Alfred');

db.runTransaction(function (transaction) {
  return transaction.get(userJohn).then(function (sDoc) {
    var age = sDoc.data().age + 1;
    transaction.set(userAlfred, { name: 'Alfred', age: age, details: userAlfredDetails });
    transaction.set(userAlfredDetails, { address: 'Alfred Villa' });
    transaction.update(userJohn, {
      age: age
    });
    transaction.update(userSuhail, {
      age: age
    });
    transaction.update(userSam, {
      age: age
    });
    return age;
  });
}).then(function (age) {
  console.log("Age changed to ", age);
}).catch(function (err) {

  console.error(err);
});

通过上面的代码,交易会更新所有用户的年龄。

答案 1 :(得分:2)

概念证明:

var transaction = firestore.runTransaction( t => {
  return t.get(eRef)
    .then(snapshot => {
      snapshot.forEach(doc => {
        var employee = doc.data();
        if(employee.status !== 'Off work') {
          t.update(doc.ref, {
            status: 'Off work',
            returnTime: '8 am'
          })
        }
      })
    })
}).then(result => {
  console.log('Transaction success!')
}).catch(err => {
  console.log('Transaction failure: ', err)
});

答案 2 :(得分:0)

您可以使用firebase提供的批处理方法。 这就是我用来存储对象数组,在新创建的集合中创建多个文档的方式。


export const addCollectionAndDocuments = async (collectionKey, objectToAdd) => {
  console.log(collectionKey, objectToAdd);

  let collectionRef = firestore.collection(collectionKey);
  const batch = firestore.batch();
  objectToAdd.forEach(obj => {
    const newDocRef = collectionRef.doc();
    batch.set(newDocRef, obj);
  });
  return await batch.commit();
};

答案 3 :(得分:-5)

您可以使用此=>

firestore.collection("YOUR_COLLECTION_PATH")
    .get()
    .then(function(querySnapshot) {
        querySnapshot.forEach(function(doc) {
            console.log(doc.id, " => ", doc.data());
        });
    })
    .catch(function(error) {
        console.log("Error getting documents: ", error);
    });

另外,如果要在数组中映射querySnapshot,可以这样做:

firestore.collection("YOUR_COLLECTION_PATH")
.get()
.then(function(querySnapshot) {
    var arrayDocs = querySnapshot.docs.map(docData=>docData.data())
    console.log(arrayDocs);
})
.catch(function(error) {
    console.log("Error getting documents: ", error);
});

信息位于https://firebase.google.com/docs/firestore/query-data/get-data