高级数据库查询 - appengine数据存储区

时间:2012-09-04 10:38:14

标签: google-app-engine

我有一个相当简单的应用程序(如CRM),它有很多联系人和相关标签。

用户可以搜索提供大量条件(搜索项目),例如

  • 过去10天内的updated_time
  • xxx中的
  • 标签
  • 标签不在xxx
  • first_name以xxx
  • 开头
  • first_name不在'Smith'

我理解索引以及过滤器(不在)中如何不能在多个属性上工作。

对我而言,由于大部分时间都是在cron中完成报告 - 我可以遍历所有记录并处理它们。但是,我想知道最好的优化路线。

我希望不是查询'ALL',而是接近可以使用appengine设计限制运行的查询,然后手动匹配查询中的其余项目。

这样做的一种方法是从第一个搜索项开始,然后获取计数,添加另一个搜索项,获取计数。它解决了这一点,然后我手动处理这些记录与其余的搜索项目。

问题是

  • 有没有办法事先知道查询是否有效,无法以编程方式进行计数
  • 如何确定集合中不会发生碰撞的最佳搜索项目(例如not-in对许多过滤器不起作用)等。

我看到它的唯一方法是将所有相等的过滤器作为一个查询,取第一个不等于过滤器,或者执行它,然后迭代搜索实体。

是否有可以帮助我的图书馆;)

1 个答案:

答案 0 :(得分:0)

  

我理解索引以及过滤器(不在其中)如何不能在多个属性上工作。

这并非严格属实。您可以创建一个“复合索引”,它允许您对多个字段执行过滤。这些消耗额外的数据。

您也可以通过生成可用于查询的“复合字段”来生成自己的复合索引等效项。

  

有没有办法事先知道查询是否以编程方式有效而不进行计数

我不确定我理解你指的是什么样的有效性。

  

如何确定集合中不会发生碰撞的最佳搜索项目(例如not-in在许多过滤器上不起作用)等。

“不在”过滤器并非易事。一种方法是创建两个数组(重复的字段)。一个包含所有标记条目,另一个包含不是所有标记。这样您就可以轻松找到包含和不包含标记的所有实体。唯一的问题是,一旦你创建了一个新的标签,就必须跨越实体,为所有实体添加一个“不在”的条目。