【问题标题】:Advanced database queries - appengine datastore高级数据库查询 - appengine 数据存储
【发布时间】:2012-09-04 10:38:13
【问题描述】:

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

用户可以搜索很多条件(搜索项),例如

  • 最近 10 天的更新时间
  • xxx 中的标签
  • 标签不在 xxx 中
  • first_name 以 xxx 开头
  • first_name 不在“Smith”中

我了解索引以及过滤器(不在其中)如何不能对多个属性起作用。

对我来说,因为大多数时候,报告是在 cron 中完成的——我可以遍历所有记录并处理它们。但是,我想知道这样做的最佳优化路线。

我希望不是查询“ALL”,而是接近一个可以在 appengine 设计限制下运行的查询,然后手动匹配查询中的其余项目。

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

问题是

  • 有没有办法事先知道查询是否以编程方式有效而无需进行计数
  • 如何确定集合中不发生冲突的最佳搜索项(例如 not-in 不适用于许多过滤器)等。

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

有没有图书馆可以帮助我;)

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    我了解索引以及过滤器(不在)如何不能对多个属性起作用。

    这并不完全正确。您可以创建一个“复合索引”,允许您对多个字段执行过滤器。这些会消耗额外的数据。

    您还可以通过生成自己的“复合字段”来生成自己的等效复合索引,您可以使用它来查询。

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

    我不确定我是否理解您所指的有效性。

    您如何确定集合中不发生冲突的最佳搜索项(例如 not-in 不适用于许多过滤器)等。

    “不在”过滤器并非微不足道。一种方法是创建两个数组(重复字段)。一个包含所有标记的条目,一个不包含所有标签。这将允许您轻松找到所有带有和不带有标签的实体。唯一的问题是,一旦你创建了一个新标签,你就必须扫描实体,为所有实体添加一个“不在”条目。

    【讨论】:

    • 我不能使用复合索引,因为我有很多搜索条件——大约有 20 个。进入而不进入。假设我有多个由用户给出的相等和不相等标准,目前我首先应用所有相等过滤器,获取结果,然后根据初始查询集中的其余过滤器过滤结果。最初的问题是看看我们是否可以以某种方式添加尽可能多的查询。另外关于标签数组,我不能使用数组,因为标签是由用户经常动态添加的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    相关资源
    最近更新 更多