【问题标题】:Why does Firestore return all records on my where query为什么 Firestore 在我的 where 查询中返回所有记录
【发布时间】:2018-02-20 23:33:22
【问题描述】:

我正在尝试根据名称查询我的收藏:

let db = Firestore.firestore()
    print(searchString)
    db.collection("Coins").order(by: "name").whereField("name", isGreaterThanOrEqualTo: searchString)
        .getDocuments(){ (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {

                var coins:[CryptoCompareService.Coin] = []
                for document in querySnapshot!.documents {
                    let coin = try! FirestoreDecoder().decode(CryptoCompareService.Coin.self, from: document.data())

                    coins.append(coin)
                }  

            }
    }

我的收藏品是这样的:

我正在发送文本,但它总是返回集合中的所有项目。有什么想法吗?

编辑:它处理区分大小写的方式看起来很奇怪。当我输入 Eth 时,它给了我所有记录,但是当我输入“eth”时,它给了我 11 条记录。这也是错误的。或者至少我不明白搜索到底是怎么回事。

【问题讨论】:

  • 文档显示whereField 过滤器 order 之前。我没有尝试过反过来查询会发生什么
  • 好的,我以为这样可以,但没有。 :-(

标签: swift firebase google-cloud-firestore


【解决方案1】:

假设“名称”字段是识别每个条目的一种方式,请尝试将您存储在名称中的数据类型更改为 整数 而不是字符串(或者您可以添加另一个字段来存储条目的唯一编号并基于该编号执行查询)。我相信当您使用 isGreaterThanOrEqualTo 时,它是在比较每个字符的 ascii 代码而不是其实际值或字符的词汇顺序,这就是为什么您在编写“Eth”或“eth”时会得到不同的结果。

在 ascii 代码中,“E”与“e”不同。

【讨论】:

  • 你的意思是把文本转换成一串整数吗?这绝对是这项特定技术的一个缺点。他们希望我通过云功能等集成文本搜索引擎......对我来说非常非常糟糕。
  • 我的意思是你将“007”存储为一个整数,所以当它存储时它看起来像这样:name: 7 注意数字 7 周围没有引号。我又是不知道为什么会发生这种情况,我没有使用 firestorm,但我假设它正在比较 ascii 代码
  • 只是为了确定。您正在尝试查询在这种情况下大于某个数字的数字“007”的名称?例如所有数字大于 5 的名称?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多