GAE w / Objectify – 你能查询HashMap吗?

在GAE中,当使用Objectify时,你能查询一个HashMap吗? 如果是这样你会怎么写呢?

ofy().load().type(MyClass.class).filter("hashMapfieldName", "keyQueryinggFor").list(); 

似乎在hashMapfieldNameHashMap地方hashMapfieldName 。 我期待找到hashMapfieldName包含某个键的实体。

就像嵌入式类一样,Objectify将Map转换为低级EmbeddedEntity对象,该对象不可索引。 但是,如果你@Index你的Map字段(或嵌入的类字段),Objectify将创建一个合成索引,让你无论如何查询。

按照您的示例,假设您有一个名为hashMapfieldName的Map字段, hashMapfieldName包含字符串"key""value"的映射。 此查询语法将返回具有该对的实体:

 ofy().load().type(MyClass.class).filter("hashMapfieldName.key", "value"); 

如果您只是在寻找密钥存在,请尝试filter("hashMapfieldName.key !=", null)

我有一个类似的情况,我在嵌入式hashmap中存储了设备特定值,其中设备ID是密钥,我需要查询包含特定值的所有实体。

上面的stickfigure建议的解决方案可以在我的测试环境中工作。 但我意识到我不能将它用于真正的应用程序,因为它不会扩展到我们预测的用户数量。 这是因为Objectify将为我保存的每个hashmap键生成属性索引 。 就我而言,这意味着每个用户的设备都有自己的索引,可能是100000个索引!

所以相反,我采用了这种替代方法:

  • 在实体上的@OnSave方法中,我将要搜索的值存储在单独的索引列表中,我只用于查询
  • 然后我会像这样执行我的过滤查询: ofy().load().type(MyEntity.class).filter("values", value)

我不确定ObjectifyHashMap

但是根据文档, HashMapDatastore不是受支持的字段类型。 即使我们serializeserialize并存储,它也将被存储为Blob,默认情况下unindexded

所以据我所知,无法查询HashMap因为没有为它创建索引。