关于谷歌应用引擎:两个过滤器替代的数据存储获取?

Datastore fetch on two filters alternative?

我有一个名为 Game 的数据存储实体,其中有两个字段名为 playerOne 和 playerTwo。这些字段中的任何一个都存储用户名。

我需要搜索 Game 实体并返回最多 30 个游戏,其中用户名可以是 playerOne 或 playerTwo...

所以在关系数据库中你会:
SELECT * FROM Game WHERE playerOne=\\'username\\' OR playerTwo=\\'username\\' LIMIT 30

但在大表中,您不能过滤多个字段!我无法从一个中获取 10,从另一个中获取 10,因为每个中的数字可以是可变的,并且按 createdDate 顺序。

您将如何在数据存储中执行此操作?


快速的答案是创建一个包含 [player_a, player_b]StringListProperty,然后简单地使用由它组成的多值索引:

1
games = Game.all().filter("players =", player_find)


您不能使用不同的字段对数据存储进行 OR 查询。如果您必须保留当前的实体模型,那么您必须执行两个查询。
1) 过滤 playerOne 并限制为 30
2)过滤 playerTwo 并限制为(30 - 查询一的结果大小)
然后将结果合并到内存中以生成最终的 30 组。
现在,如果您还想要按日期订购,那么它会变得更加棘手。但是,您编写的 SQL 查询没有任何顺序,所以我也省略了它。

但是,如果您可以更改实体模型,那么实现您想要的一个好方法是拥有一个包含两个用户名列表的单个字段。
然后您可以按照以下样式进行简单查询:
SELECT * FROM Game WHERE playerBoth = 'username'