Firestore arrayunion 提供任何回调?

Firestore arrayunion provides any callback?

您好,我正在构建某种投票系统,我想防止同一用户在同一 post 中投票。

  let db = firebase.firestore();
  var postRef = db.collection("posts").doc(this.pid);
  postRef.update({
    votes: firebase.firestore.FieldValue.increment(1)
  });
  var userRef = db.collection("users").doc(this.userId);
  userRef.update({
    votes: firebase.firestore.FieldValue.arrayUnion(this.pid)
  });
  //run this line if pid is added
  this.votes = this.votes + 1;

我只想在将 pid 添加到 votes 数组时增加投票。我想知道 arrayUnion 是否能够对此提供某种反馈,或者无论如何我都能做到。

你可以看看this post,你可以看到同一个人可以对同一个post进行多次投票。

遗憾的是,根据设计 incrementarrayUnion 不提供任何回调。

为了实现您的要求,您需要一个交易(在幕后被incrementarrayUnion使用):

const postRef = db.collection("posts").doc(this.pid);
const userRef = db.collection("users").doc(this.userId);

db.runTransaction(async (t) => {
    const post = await t.get(postRef);
    const user = await t.get(userRef);

    if (!user.get('votes').includes(this.pid)) {
        t.update(postRef, {votes: post.get('votes') + 1});
        t.update(userRef, {votes: [...user.get('votes'), this.pid]});
    }
});