【问题标题】:firestore getDocuments().size() != getDocumentChanges().size()firestore getDocuments().size() != getDocumentChanges().size()
【发布时间】:2021-10-26 01:39:42
【问题描述】:

我用一个复杂的查询来查询我的 firestore 数据库

            .whereIn(gender_node, getInterestedIn())
            .whereGreaterThanOrEqualTo(birthdate_year_node, getShowAgeMax() + 1)
            .whereLessThanOrEqualTo(birthdate_year_node, getShowAgeMin())

但我遇到了IndexOutOfBoundException,因为getDocuments().size() 不等于getDocumentChanges().size()

我在文档中找不到任何内容,有人知道何时或为什么 getDocuments().size() != getDocumentChanges().size() 吗? 我假设每个Document 都会有一个DocumentChange

并非每次都会发生,因此很难调试。

有 7 个测试文档,getDocuments().size() 始终为 7,但 getDocumentChanges().size() 有时为 5。据我所见,似乎始终是数字 5。

【问题讨论】:

  • 最后一行的右括号似乎不正确。应该是.whereLessThanOrEqualTo(birthdate_year_node, getShowAgeMin())
  • 您尝试过 Frank van Puffelen 的建议吗?如果你去掉那个括号,它会起作用吗?
  • 哦不,我稍微简化了源代码,而额外的附加说明是我做的。如果插入过多,IDE 会将其显示为语法错误。
  • 能否分享您提到 getDocuments().size() != getDocumentChanges().size() 的代码?
  • 代码中没有,我在调试器中看到了。在SnapshotListenerEventListener<QuerySnapshot>中的onEvent中的任何地方都是如此。

标签: android firebase google-cloud-firestore


【解决方案1】:

getDocument().size() 和 getDocumentChanges().size() 是两种不同的方法。

  1. getDocumentChange().size() 返回文档列表 自上次快照以来发生了变化。
  2. getDocument().size() 返回 文件清单。

有关这些方法的详细信息,请参阅documentation section

假设,如果您有 7 个文档,并且自上次快照以来有 2 个文档发生更改,则 getDocument().size() 将为 7(包括新添加或修改的文档)here 和 getDocumentChanges().size () 总是指已更改文档的数量,在本例中为 2。 因此是条件,

getDocument().size() ! = getDocumentChanges().size()

是的。

【讨论】:

  • 好的,我做对了吗:如果我发送查询,查询返回getDocuments() 中的所有文档和getDocumentChanges() 中的所有文档更改,如果文档中没有更改然后getDocument().size() ! = getDocumentChanges().size()?有没有办法告诉firestore只发送已更改的文件?尽量减少流量?
  • 是的,getDocument()将这个QuerySnapshot中的所有文档按照查询的顺序返回为List; getDocumentChanges() 返回自上次快照以来更改的文档列表。
  • 而且,Firestore 查询没有“仅查询已更改的内容”的概念。您将需要自己创建该概念。执行此操作的常用方法是在每个文档中记录其上次更新时间的时间戳,然后使用范围过滤器中的该字段仅获取自收到最新更新以来更新的文档。您将需要在客户端中跟踪最新的更新时间戳。一种可能性是使用迄今为止在任何文档中看到的最大时间戳。
【解决方案2】:

您是否有可能在此行中关闭了额外的括号? (就在birthdate_year_node之后)

.whereLessThanOrEqualTo(birthdate_year_node),getShowAgeMin())

否则,您能否分别使用 3 个“where”子句中的每一个来运行您的代码,以便我们知道这三个子句中的哪一个导致了问题。

【讨论】:

  • 哦不,我稍微简化了源代码,而额外的附加说明是我做的。如果插入过多,IDE 会将其显示为语法错误。
  • 问题是,bug并不是每次都出现。我可以单独运行它们,但很可能它们都单独工作,然后它们一起工作,就像 90% 的时间一样。有 7 个测试文档,getDocuments().size() 总是 7,但 getDocumentChanges().size() 有时是 5。据我所见,似乎总是数字 5。
猜你喜欢
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 2017-06-13
  • 2012-01-28
  • 1970-01-01
  • 2020-11-18
  • 2013-07-16
相关资源
最近更新 更多