【问题标题】:Does whereEqualTo support HashMap equality?whereEqualTo 支持 HashMap 相等吗?
【发布时间】:2020-07-07 19:00:43
【问题描述】:

whereEqualTo API 可以将Any 作为其参数。这是否意味着我可以将HashMap<K, V> 传递给它,它会将其匹配字段与Firestore 数据库中map 类型的字段进行比较,还是我必须手动比较地图的每个属性?

我已经建立了一个这样的查询

collection.whereEqualTo("meta", hashMapOf( // <-- using full hash-map for matching
    "user" to "JD",
    "name" to "John"
))

其中meta 是一个map 类型的字段,具有两个键/值对。

我要匹配的文档具有以下结构:

{
    "createdOn": as timestamp
    ...other properties
    "meta": as map
    {
        "user": "JD", as string
        "name": "John" as string
    }
}

我使用的条件应该会产生一些结果,但它不会(没有崩溃)所以我想知道我是否在其他地方犯了错误,或者这种类型的查询根本不支持?结果为空。

我也可能只搜索 name 属性,使用像这样的更简单的查询来查找所有 Johns

collection.whereEqualTo("meta", hashMapOf( // <-- using parcial hash-map for matching

    "name" to "John"
))

它会仅匹配 name 字段还是需要完整映射?

我的意思是,前面的查询应该工作还是我需要重写?

collection
    .whereEqualTo("meta.user", "JD")
    .whereEqualto("meta.name", "John")

【问题讨论】:

  • 请编辑问题以显示您认为该查询应该匹配的文档。还要清楚 username 是什么。对值进行硬编码效果最好。

标签: android kotlin google-cloud-firestore hashmap equality


【解决方案1】:

Firestore 可以将客户端代码中的地图项与文档中的地图进行比较。但映射必须完全等效,因此您必须在代码中指定所有属性。所以这样的事情应该可以工作:

collection.whereEqualTo("meta", hashMapOf( // <-- using parcial hash-map for matching
    "user" to "JD",
    "name" to "John"
))

如果您无法使其正常工作,请编辑您的问题以包含您认为应该匹配的文档的屏幕截图,我会再看一下。

没有办法为一个字段指定部分映射匹配,所以如果这是您需要的,您确实需要为每个嵌套字段添加单独的条件。

【讨论】:

  • 确实,我创建了更多测试,但部分地图不起作用。您需要单独比较每个字段,并且需要创建多个索引来支持所有可能的组合。
猜你喜欢
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
相关资源
最近更新 更多