【问题标题】:Appengine's Indexing order, cursors, and aggregationAppengine 的索引顺序、游标和聚合
【发布时间】:2012-12-18 10:47:59
【问题描述】:

我需要对数据集进行一些连续聚合。我正在使用应用引擎高复制数据存储。

假设我们有一个简单的对象,该对象的属性包含创建日期的字符串。还有其他字段与对象相关联,但在本例中并不重要。

假设我创建并存储了一些对象。以下是与每个对象关联的日期。每个对象按以下顺序存储。这些对象将在单独的事务中创建。

Obj1: 2012-11-11
Obj2: 2012-11-11
Obj3: 2012-11-12
Obj4: 2012-11-13
Obj5: 2012-11-14

这个想法是使用游标不断检查新的索引对象。将对新的索引实体进行聚合。

以下是我的问题:

1) 对象是否按顺序索引?就像 Obj4 是否可以在 Obj 1,2 和 3 之前被索引?如果我使用 ORDER BY 查询和游标继续搜索,这将是一个问题。如果索引出现延迟,将无法找到某些实体。

2) 如果没有指定 ORDER BY,查询中返回的实体是什么顺序?

3) 我将如何检查新的索引实体?如,抓取所有实体,存储光标,然后检查自上次查询以来是否有任何新实体被索引?

不那么重要,但值得深思

4) 是否所有字段都编入索引?例如,如果我有一个 date 属性,假设是一个 name 属性,对于给定的对象,这两个属性是否会同时被索引?

5) 如果在同一个事务中写入多个实体,那么事务中的所有实体是否同时被索引?

6) 如果所有实体都属于同一个实体组,是否所有实体都同时被索引?

感谢您的回复。

【问题讨论】:

  • 如果您添加新项目等,光标将变得无关紧要(过时)。所以我认为你不能像你所说的那样使用它。
  • 在某些情况下,是的。但是,我不会在游标之前修改数据,因此游标应该仍然有效。让我的查询正确很重要,因此新索引将始终位于光标之后。如果有兴趣,请阅读“游标和数据更新”。 developers.google.com/appengine/docs/java/datastore/…
  • 啊,刚刚在文档中发现了这一点,在游标上也发现了这一点新的 App Engine 版本可能会更改内部实现细节,从而使依赖于它们的游标失效。如果应用程序尝试使用不再有效的游标,Datastore 会引发 BadRequestError 异常

标签: google-app-engine cursor aggregation datastore


【解决方案1】:
  1. 所有实体的每个属性都有默认索引。如果您使用ORDER BY someProperty,那么您将获得按该属性值排序的实体。您在索引构建方面是正确的:查询使用索引并且索引是异步构建的,这意味着查询可能不会在添加实体后立即找到它。

  2. ORDER BY 默认为ASC,即升序。

  3. 为您的实体添加一个created 时间戳,然后按它排序并重复光标。见Cursors and Data Updates

  4. put() 操作返回后建立索引。它们也是并行构建的。这意味着当您查询时,可能会构建一些索引,而有些则不会。见Life of a Datastore Write。请注意,如果您想对实体强制“应用”,您可以在put() 之后发出get(),这将强制应用更改(= 写入索引)。

  5. 和 6. 在同一事务中涉及的所有实体必须在同一实体组中(=具有共同的父级)。 Transaction isolation docs 表示可以取消应用事务,这意味着在 put() 之后的查询将找不到新实体。同样,您可以通过读取或祖先查询强制应用实体。

【讨论】:

  • 感谢您的回复。关于#2,如果没有使用 ORDER BY,使用什么属性?是关键价值吗?或者它是否按照它们被索引的顺序返回实体?对于#3,我打算不重新运行游标。如中,运行查询,存储光标,然后重复。正如您所说,如果索引延迟,可能会错过实体,这对我来说是个问题......关于 5 和 6,您可以在单个事务中拥有多个实体组! developers.google.com/appengine/docs/java/datastore/…我很好奇所有索引是否同时出现。
  • 我很好奇所有索引是否同时出现在应用事务的同时
  • 如果没有使用 ORDER BY,实体将按键顺序返回(您可以在 GAE Admin - Data Viewer 中看到)。
  • 应用阶段完成后,所有索引都已完成,这意味着您可以看到所有索引。问题是您不知道应用阶段何时完成。但是,您可以通过在 put 后​​执行读取或祖先查询来强制应用阶段完成。
  • 啊,刚刚在文档中找到了这个。未指定排序顺序时,查询结果的排序未定义。 developers.google.com/appengine/docs/python/datastore/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 2014-10-04
  • 1970-01-01
  • 2019-09-27
  • 2017-03-24
相关资源
最近更新 更多