Javascript 使用以前的状态更新firestore

Javascript 使用以前的状态更新firestore,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,是否可以使用以前的状态更新firestore 例如,我有一个地址文档,它有一个users字段,其中包含一个与地址关联的用户数组。 每当我想向这个数组添加一个新用户时,我都需要上一个数组,否则我将用新数据覆盖当前数据 所以我最终得到了这样的结果 firestore() .collection("addresses") .doc(addressId) .get() .then(doc => { this.db .collecti

是否可以使用以前的状态更新firestore

例如,我有一个地址文档,它有一个
users
字段,其中包含一个与地址关联的用户数组。 每当我想向这个数组添加一个新用户时,我都需要上一个数组,否则我将用新数据覆盖当前数据

所以我最终得到了这样的结果

   firestore()
    .collection("addresses")
    .doc(addressId)
    .get()
    .then(doc => {
      this.db
        .collection("addresses")
        .doc(addressId)
        .update({
          users: [...doc.data().users, id]
        })
    });
有没有一种方法可以访问以前的数据而不必嵌套调用

如果不是


是否有更好的方法来管理关系?

如果需要以前的值来确定新值,则应使用。这是确保不同客户端不会意外覆盖彼此操作的唯一方法

不幸的是,事务也需要嵌套调用,因为这是获取当前值的唯一方法,甚至还有一个额外的包装器(用于事务)

var docRef = firestore()
    .collection("addresses")
    .doc(addressId);

return db.runTransaction(function(transaction) {
    // This code may get re-run multiple times if there are conflicts.
    return transaction.get(docRef).then(function(doc) {
        transaction.update(docRef, { users: [...doc.data().users, id ]});
    });
}).then(function() {
    console.log("Transaction successfully committed!");
}).catch(function(error) {
    console.log("Transaction failed: ", error);
});
最佳解决方案是使用不需要当前值来添加新值的数据结构。这是其中一个原因:当多个用户可能向阵列中添加项目时,它们本身很难扩展。如果不需要维护用户之间的顺序,我建议为用户使用类似集合的结构:

users: {
  id1: true,
  id2: true
}
这是一个有两个用户(
id1
id2
)的集合。
true
值只是标记,因为不能有没有值的字段

使用此结构,添加用户非常简单:

firestore()
    .collection("addresses")
    .doc(addressId)
    .update({ "users.id3": true })

还可以看到

事务api正是我想要的。谢谢!我将采用第二种解决方案并删除阵列,我认为这将更易于管理。谢谢Frank。