【问题标题】:Firestore query not receving updates on create new docFirestore 查询未收到有关创建新文档的更新
【发布时间】:2021-11-17 08:06:11
【问题描述】:

我有一个 Firestore 查询,我需要它来监听新文档的创建,我尝试了很多可能性但无法使其工作,每次创建文档时都不会触发监听器。这是我的监听代码:

firestore
        .collection("users")
        .document("123")
        .collection("images")
        .whereField("postId", isEqualTo: "123")
        .order(by: "createdAt", descending: true)
        .limit(to: 1)
        .addSnapshotListener { [weak self] snapshot, error in
            guard let imageDocument = snapshot?.documents.first else {
                return
            }
            // this print statement is only being called once (not being called when creating a new doc)
            print(imageDocument)
        }
...

这是我创建文档的查询:

firestore
    .collection("users")
    .document("123")
    .collection("images")
    .document()
    .setData([
        "postId": "123",
        "imageUrl": "....",
        "createdAt": Timestamp()
    ]) { error in
       guard let error = error else { return }
       print(error)
    }

我的目标是当我在 Firestore 中创建新文档时触发此侦听器。

此外,如果我从侦听器查询中删除限制,代码可以工作,但我会花费大量不必要的读取。

【问题讨论】:

  • 您是否可能没有在您描述的树中创建文档? IE里面的“users”集合、“123”文档、“images”集合等
  • @jnpdx 不,我正在正确创建。如果我删除限制,按升序排序并获取最后一个文档,它可以正常工作,但我不想不必要地花费 firestore 读取。
  • 请编辑您的问题以显示您遇到问题的最小关闭/完成处理程序。至少print 的值,并向我们展示更新的代码及其有问题的输出。如果我们可以看到编写您希望在查询中看到的文档的代码,这可能也会有所帮助,这里的所有值都像您在查询中所做的那样(耶????)进行硬编码。
  • 嘿@FrankvanPuffelen,感谢您的关注。我用创建查询更新了问题,希望对您有所帮助。
  • 嗯....我没有立即看出那里可能出了什么问题。我希望其他人发现问题。

标签: ios swift firebase google-cloud-platform google-cloud-firestore


【解决方案1】:

问题不在于您向 Firestore 添加数据的方式,而在于您读取数据的方式。也没有与“limit(to: 1)”调用相关的内容。当您执行以下查询时:

firestore
    .collection("users")
    .document("123")
    .collection("images")
    .whereField("postId", isEqualTo: "123")
    .order(by: "createdAt", descending: true)
    .limit(to: 1)

这意味着您要从“images”子集合中获取所有文档,其中“postId”字段的值为“123”,然后根据“createdAt”字段对结果进行排序降序并将结果限制为“1”。

要使这样的查询工作,您必须为它创建一个index,否则它不会返回任何结果。您可以在Firebase Console 中手动创建所需的索引:

或者您会在 IDE 中找到如下所示的消息:

FAILED_PRECONDITION: The query requires an index. You can create it here: ...

您只需单击该链接或将 URL 复制并粘贴到网络浏览器中,系统就会自动为您创建索引。

代码应保持不变。

【讨论】:

  • 嗨维托。你有没有试过我上面的解决方案,它有效吗?
  • 嘿,成功了!!我的索引是两个字段升序,将 createdAt 更改为降序就可以了。非常感谢!
【解决方案2】:

您的查询中有limit(to: 1)。尝试删除它。

【讨论】:

  • 如果我取消限制,它会起作用,但我不想不必要地花费 firestore 读取。
猜你喜欢
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 2018-11-28
  • 2020-07-27
  • 2020-06-06
  • 1970-01-01
相关资源
最近更新 更多