VueJs、Vuefire、Firestore:如何过滤同步的 Firestore 文档

VueJs, Vuefire, Firestore: How can I filter a synched Firestore document

使用 vuefire 允许我在 vue 实例上设置一个 firestore 对象并自动将其与 Firestore 同步。我还想为另一个数据点过滤它,但过滤会导致错误。

下面的代码 returns 需要并且工作完美的员工。 Firebase 用户 (fbUser) returns

WEBPACK_IMPORTED_MODULE_0__services_Firebase.a.collection(...).filter is not a function

VueTools 中数据点为空

firestore() {
    return {
        staff: db.collection('staff').orderBy('lastname'),
        fbUser: db.collection('staff').filter(s => s.email === this.current_user.email)
    }
 },

db.collection 不直接 returns 结果。我不知道实现,但我想 vuefire 将创建一个名为 fbUser 的数据字段并将结果保存在其中。

我认为,最好的解决方案是使用像这样的计算数据:

computed: {
    fbUserFiltered () {
        return this.fbUser.filter(s => s.email === this.current_user.email);
    }
}

我知道这是一个老问题,但我遇到了同样的问题,想要一个更笼统的答案。

如果您想避免查询整个集合只是为了丢弃客户端上的不匹配结果,您可以在 created() 事件中使用 $bind() 函数,例如

  data: () => ({
    finance_staff: [],
  }),

  created() {
    const filtered_entries = db.collection('staff').where('department', '==', 'finance');
    this.$bind('finance_staff', filtered_entries);
  },

或者如果您需要等待授权状态:

  created() {
    auth.onAuthStateChanged(async user => {
      if (!user) return;
      const filtered_entries = db.collection('staff').where('manager_id', '==', user.uid);
      this.$bind('my_staff', filtered_entries);
    });
  },

注意,如果你已经知道文档ID,那就更简单了:

  firestore: {
    current_employee: db.collection("staff").doc("abcd1234")
  },