使用对象查询Firestore集合

4

我创建了一个名为“books”的集合,在其中创建了一个名为“users”的对象(也称为字典)。该对象如下所示:

users: {
    5PPCTcdHOtdYjGFr7gbCEsiMaWG3: firebase.firestore.FieldValue.serverTimestamp()
}

现在我想查询属于某个用户的所有书籍。我尝试过这样做:
this.db
  .collection('books')
  .where(`users.${this.state.currentUser.uid}`, '>', 0)
  .onSnapshot(querySnapshot => {
      ...

我从未收到任何文件。 我确定它应该匹配某些内容。 Firestore控制台的截图 为了检查我的理智,如果我删除where(...)部分,我确实收到文档。 只是我会得到所有用户的文档。
我在.where()中记录了那个字符串,并且看起来很正确。

作为短期的解决方案,我会遍历所有文档并比较每个“doc.data().users”。但这不是一个好的解决方案。 - Peter Bengtsson
2个回答

3

您的查询有误,因为您正在比较一个日期对象和一个数字,这是两个不同的东西。您可以通过运行下面的这两行代码来检查它。

  console.log(typeof(firebase.firestore.FieldValue.serverTimestamp()))
  console.log(typeof(0))

所以你有两个选择:
1 - 你可以像下面这样比较日期对象和数据对象。
this.db
  .collection('books')
  .where(`users.${this.state.currentUser.uid}`, '>', new Date(0))
  .onSnapshot(querySnapshot => {
      ...

2 - 或者你可以将日期保存为毫秒并与一个数字进行比较。

users: {
    5PPCTcdHOtdYjGFr7gbCEsiMaWG3: new Date().getTime();
}

 this.db
      .collection('books')
      .where(`users.${this.state.currentUser.uid}`, '>', 0)
      .onSnapshot(querySnapshot => {
          ...

1

我也无法使用.where()让其工作,但是似乎可以使用.orderBy()来实现,将以下内容替换:

.where(`users.${this.state.currentUser.uid}`, '>', 0)

使用

.orderBy(`users.${this.state.currentUser.uid}`)

是的,似乎 orderBy 单独使用就足够了,但是谁知道呢,这可能会改变,使用 new Date(0) 更安全。 - user5084201

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接