Appengine的索引顺序,游标和聚合

时间:2012-12-18 10:48:00

标签: google-app-engine cursor aggregation datastore

我需要对数据集进行一些连续聚合。我正在使用应用程序引擎High Replication Datastore。

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

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

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)是否所有字段都编入索引?如果我有一个日期属性,并且让我们说一个名称属性,两个属性是否会同时为给定对象编制索引?

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

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

感谢您的回复。

1 个答案:

答案 0 :(得分:1)

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

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

  3. 向您的实体添加created时间戳,然后按顺序排序并重复光标。请参阅Cursors and Data Updates

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

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