App Engine,如何检查列表中的所有值是否在数据存储中的字符串列表中

0 投票
3 回答
622 浏览
提问于 2025-04-16 07:49

假设你在数据库里有一个字符串列表,里面的值是:

a,b,c

你想要比较这个列表和另一个列表,只有当字符串列表里的每一个值都在这个列表里时,才返回“真”。

比如说,列表 ['a', 'b'] 会返回“假”,因为缺少了 'c'。

而列表 ['a', 'b', 'c'] 会返回“真”,因为所有的值都有。

再比如,列表 ['a', 'b', 'c', 'd', 'e'] 也会返回“真”,因为虽然多了 'd' 和 'e',但 'a'、'b' 和 'c' 都在里面。

那么,使用 GQL(谷歌查询语言)能做到这一点吗?还是说我需要把字符串列表提取出来,然后一个一个地检查?

3 个回答

1

你可以把你的列表按照排序的方式,作为一个单独的字符串来保存。根据你的字符串列表的内容,这可能就像用逗号分隔的值那么简单。

你也可以选择使用像md5这样的校验和,来减少存储的字符串长度,这样在过滤时也会更方便。

2

这件事直接做是不行的。你可以使用多个相等的过滤条件,这样查询结果只会匹配那些至少包含你列表中这些项目的实体(比如说,“WHERE foo = 'a' AND foo = 'b'”,只有当foo的列表里至少有'a'和'b'时才会匹配)。如果你这样做而没有使用不等式过滤或排序,数据存储系统会用内置的合并连接策略来满足你的查询。

不过,使用反规范化的方法会提供更强大的解决方案。例如,如果你把你的列表序列化成一个单独的字符串,你就可以简单地用这个字符串进行相等性检查。

2

来自文档

查询无法直接比较两个列表的值。要判断两个列表是否相等,必须逐个检查每个元素。

所以我猜你的比较也是不能直接进行的。

使用集合来比较可能会更高效,而不是一个一个地遍历列表。

撰写回答