【问题标题】:Firestore query on sub-collection doesn't return data对子集合的 Firestore 查询不返回数据
【发布时间】:2020-10-15 17:31:11
【问题描述】:

我在 Firestore 中有一个具有以下结构的数据库:

users/{用户文档}/requests/{请求文档}

编辑:我添加了显示数据的 firebase 控制台的屏幕截图。有点难看,但您可以看出用户的记录以及请求存在。您还应该能够看到“路径”。我希望这会有所帮助。

我需要查询特定用户的 requests 集合(所以这不是 CollectionGroup 的事情)。我正在使用 Angular Firebase 并尝试以下操作

var ref = db.collection("users").doc("0g0ujmsgdTa7NgaJPUV5ULjumIV2").collection("requests")

var result = await ref.where("to","==","frank").get();
console.log(result.size);

这将返回零记录的结果(其中已确认用户文档的存在(那个长字符串)并且请求集合中的多个文档包含设置为“坦率”的字段“to”。

从各方面来说,这应该可行。我尝试了许多其他查询,例如拉下请求集合的所有记录(意味着请求集合上的 get() ),并且它有效。我已经尝试过对用户集合(使用与用户相关的数据)进行类似查询,并且效果很好。

有什么我可以尝试解决为什么会发生这种情况的吗?

【问题讨论】:

  • 由于我们看不到您数据库中的数据,因此我们不知道您是否在进行实际上应该返回任何内容的查询。请编辑问题以更详细地解释您对此查询的确切期望,并显示应匹配的文档示例。数据截图会有所帮助。
  • 这应该返回 3 个文档。该用户大约有 8,800 个请求文档,但只有 3 个将“to”设置为“frank”

标签: javascript angular firebase google-cloud-firestore


【解决方案1】:

您尝试查询的数据作为一个字段嵌套在名为“inRequest”的地图字段下。您需要确定该字段的完整路径,以便使用dot notation进行查询:

var ref = db
    .collection("users")
    .doc("0g0ujmsgdTa7NgaJPUV5ULjumIV2")
    .collection("requests")
var result = await ref
    .where("inRequest.to", "==", "frank")
    .get();
console.log(result.size);

注意where() 的第一个参数。

【讨论】:

  • 首先,谢谢!这确实有效。我需要深入研究一下才能确切了解原因。在我的辩护中(或者至少我认为这支持了我试图做的事情):firebase.google.com/docs/firestore/query-data/queries#node.js_1
  • 抱歉,还有一条评论。我注意到这个“inRequest”包装器的存在,我想知道这是否是新的,如果不是,为什么它似乎没有出现在文档中。对于其他查看此内容的人,请务必注意 Firebase 会返回您的文档,但它包含在一个 inRequest 对象中。
  • inRequest 之所以存在,是因为那里写了一些东西。它不是 Firestore 的一部分 - 它是写入数据。如果这不是您想要的,您必须找到编写它的代码并修复它。
  • 大声笑,现在我脸红了。我现在知道我在哪里写它。再次感谢您的帮助。
【解决方案2】:

根据文档,如果我的理解是正确的,你应该这样做

var myCollection = db.collection("users").doc("0g0ujmsgdTa7NgaJPUV5ULjumIV2").collection("requests", ref => ref.where('to', '==', 'frank'))
myCollection.get().subscribe((response) => console.log(response))

where 不是firebase.firestore.collection 的方法,而是firebase.firestore.CollectionReference. 的一种方法

使用get() 方法,除了Observable 之外,您将一无所获

(未测试)

参考

documentation

【讨论】:

  • 因此,当我尝试在我的代码中实现时,我在 'ref' 函数(被传递到集合中)上得到 'expected 1 argument but go 2'。它不喜欢第二个论点。我不确定这是否相关,但我正在 Firebase 的云功能中执行此操作。
  • @user1684600 你不是在用 angularfire 吗?
猜你喜欢
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多