当前位置: 首页 > 知识库问答 >
问题:

按列表过滤-Object tify

臧令
2023-03-14

这个查询有效,fullPath字段是一个列表

    KeyLookup lookup 
        = ofy().load().type(KeyLookup.class).filter("fullPath IN", key.getFullPath()).first().get();

上面的查询还获取在List中具有相同String元素的实体

我怎样才能只过滤那些列表中元素完全相同的实体,比如“不多不少”

更新:

例如

一个实体(说Object1)字段fullPath包含:

  • “一个”

另一个实体(比如Object2)字段fullPath包含:

  • “一个”
  • “两个”
  • “三个”
  • “四个”

key.getFullPath包含:

  • “一个”
  • “两个”
  • “三个”
  • “四个”

然后,上面的查询将返回Object1Object2,但是我需要的是,它只返回Object2


共有2个答案

郎星汉
2023-03-14

这是意料之中的,因为在比较一个查询中的两个列表时,实际发生的情况是,数据存储为过滤器列表中的每个值触发多个查询。因此,当您查询Object2时,会对Object2中的每个值执行四次查询。因为,Object1Object2的“子集”,所以它也匹配查询。这就是您同时获得Object1Object2的原因。

您可以修改查询以使用运算符来强制进行精确匹配。因此,您可以拥有以下功能:

Query<KeyLookup> q = ofy().load().type(KeyLookup.class);
for (String f : key.getFullPath()) {
    q = q.filter("fullPath", f);
}
KeyLookup lookup = q.first().get();

希望这有帮助。

谈阎宝
2023-03-14

假设你想要一个精确的匹配(没有更多的值,没有更少的值),没有“原生数据存储”的方法来实现这一点。在获取or操作时,对filter()的多次调用将为您提供and操作,这两个操作都不完全匹配。然而,还是有办法的。

选项1:将列表加入到单个索引属性中

将列表中的所有项连接成一个值,并将其存储为合成索引属性。也许您需要根据顺序或大小写的重要性对其进行规范化。查询该属性,而不是列表属性。

只有当连接的值保证适合500个字符以下时,这才有效。似乎不太可能。相反,你可能想要。。。

选项2:对列表的哈希进行索引和查询

  1. 创建一个包含所有列表值的哈希值的合成属性,比如fullPathHash。它不需要加密安全;MD5很好
 类似资料:
  • 问题内容: 我有两个列表,我要过滤两个列表都包含的thoose元素。我想用lambda表达式做到这一点。 用户getName和客户端getUserName都返回String。 这是我的示例代码: 问题答案: 但这效率很低,因为它是O(m * n)。您最好创建一组可接受的名称: 还要注意,它并不严格等同于您拥有的代码(如果已编译),如果有多个用户具有与该客户端相同的名称,则该客户端会将同一客户端两次

  • 问题内容: 在Python中,我有一个元素列表和一个索引列表。我有什么办法可以立即检索其中的值作为索引的所有那些项? 例: 问题答案: 我不知道有什么方法可以做。但是您可以使用列表理解:

  • 问题内容: 我开始使用django-tables2(从第一印象中就可以强烈推荐),我问自己如何实现列过滤。我找不到合适的文档,但是我确定它在那里。 问题答案: 答案有点晚了,但是无论如何…我也找不到任何合适的文档来进行列过滤。有很多方法可以做到这一点: 答:手动:我添加了一个包含要过滤的字段的表单,然后在我的视图中执行以下操作: 这很好用,但是不是那么干,因为它在视图中是硬编码的。 B.使用Sin

  • 4.5. 过滤列表 如你所知,Python 具有通过列表解析(第 3.6 节 “映射 list”)将列表映射到其它列表的强大能力。这种能力同过滤机制结合使用,使列表中的有些元素被映射的同时跳过另外一些元素。 过滤列表语法: [mapping-expression for element in source-list if filter-expression] 这是你所知所爱的 列表解析 的扩展。

  • 问题内容: 我的代码如下所示: 它返回一个列表,其中仅包含与匹配的条目。我想知道是否有一个内置的功能,类似于: 问题答案: 除了Konstantin的回答:Java 8 通过对该类添加了支持,该类在内部调用: 太棒了!

  • 过滤字段的列表,每一个成员应该是数组或对象 $data = [ ['id'=>1, 'name'=>'a'], ['id'=>2, 'name'=>'b'], ]; // 两个毫无意义的实例化写法 $list = new FilterableList; $list = new FilterableList($data); // 只保留 name 字段 $list = new Fi