【问题标题】:FireStore - Search for value in arrayFireStore - 在数组中搜索值
【发布时间】:2020-09-04 20:25:07
【问题描述】:

好的,所以我一直在网上搜索,但找不到我的问题的解决方案。我使用了以下查询,但仍然没有运气:

        .whereField("Features.tagName", arrayContains: tagName)
        .whereField("Features", arrayContains: "tagName: \(tagName)")
        .whereField("Features", arrayContains: "tagName: \(tagName)")
        .whereField("Features", arrayContainsAny: [tagName])
        .whereField("Features", in: [tagName])
        .whereField("Features.tagName", arrayContainsAny: [tagName])

我想我会添加这些以显示我是否走在正确的轨道上,并希望避免任何混淆或推荐任何这些查询作为解决方案的事件。

我指向了正确的集合,因为我声明了一个全局常量,我可以调用它并用于其他查询/方法。

我的数据库结构如下:

Post - 
 PostID -
   username
   date
   features[]

但是,必须注意我的 features 数组的结构是这样的:

features: [
[0] tagName: "Blue",
[1] tagName: "Yellow"
]

我似乎无法返回任何东西。我只查询一个标签。我有一种强烈的感觉,这是因为tagName。但是我已经使用了插值或尝试过,但仍然没有运气。

有人知道我哪里出错了吗?

【问题讨论】:

  • features 数组是否包含除 tagNames 之外的任何其他内容?
  • @Emmanuel 我知道问题出在哪里。我使用 CodingKeys/identifiable 允许用户选择标签。我有一个名为tagName 的键,如果我在上传之前从数组中删除这个前缀,我可以查询索引。然而,这本身就是一个挑战。但是,要回答您的问题,features 将仅包含 tagName
  • 您对这段代码.whereField("Features.tagName" 有何期待?更具体地说,Features 是什么?你的数组是features?而且这个 [0] tagName: "Blue", 看起来真的不像一个普通的 firestore 数组——它看起来像一个地图数组?
  • 另外,我相信您不能对数组中的对象字段运行查询,但如上所述并不清楚该结构是由什么组成的。你能澄清一下吗?

标签: swift firebase google-cloud-firestore


【解决方案1】:

正如您在评论中提到的,推荐的方法是删除tagName,因为所有数组元素都将具有键tagName,并将结构保留为:

features: [
  "Blue",
  "Yellow"
]

然后就可以查询了:

db.collection("Post")
  .whereField("features", arrayContains: "Blue")

但是,如果无法更改结构,您可以将其查询为:

db.collection("Post")
  .whereField("features.tagName", isEqualTo: "Blue")

【讨论】:

  • 很遗憾,这行不通。我以前尝试过这种解决方案。
  • 您是否使用与集合中声明的大小写相同的大小写来执行查询?请记住,查询区分大小写
  • 一模一样,还加了分号看看能不能用。
  • 你在哪里添加了分号?您能否编辑您的帖子以显示您的收藏/文档结构以及您如何查询它的精确示例?我在问,因为在发布的示例中,您使用 Features 和大写 F 并且结构描述具有 features
  • @Jay 我看了一些订单帖子,按照推荐的做了。创建了一个单独的数组,它只接受没有字段名的字符串。
猜你喜欢
  • 2019-07-26
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
相关资源
最近更新 更多