Google App Engine NDB排序会丢失实体

时间:2015-04-15 15:27:57

标签: python sorting google-app-engine google-cloud-datastore app-engine-ndb

我正在尝试根据分数对从数据集中提取的几个实体进行排序,但目前它只返回1个实体,而不是当前数据存储区中的4个实体。

该模型定义如下:

class Place(ndb.Model):
    """Model for places."""
    title = ndb.StringProperty()
    url = ndb.StringProperty()
    longitude = ndb.StringProperty()
    latitude = ndb.StringProperty()
    score = ndb.IntegerProperty()
    votes = ndb.KeyProperty(repeated = True, kind = 'Vote')
    reviews = ndb.KeyProperty(repeated = True, kind = 'Review')

我试图获取10个最高得分位置的查询是:

places = Place.query().order(Place.score).fetch(10)

我拥有的当前数据集: Screenshot of datastore

这导致只返回A个地方,而不是其他实体。

如何从最高到最低score对实体进行排序?

PS:我已经谷歌搜索过,找不到任何可行的解决方案。

1 个答案:

答案 0 :(得分:5)

您正在做的事情很好,所以问题在于数据本身。

从数据存储控制台的外观我可以看出写入是以不同的方式完成的,数据的形状在你得到的实体和其他实体之间是非常不同的,还有写Ops 专栏,它告诉我们很多。

只有2个写入的实体没有索引任何属性,除了ID本身,它按升序和降序写入,导致所述2次写入操作。

您获得的实体有4次写入,显然还有其他索引正在写入,且必须为score,否则您将无法获取任何数据。查询仅适用于索引属性,实体可以存在但是不可见"如果filter属性在执行时没有编入索引。

如果模型在代码中看起来与此问题中的方式相同,则put()实体应至少再写12个索引。

无法告诉您导致这种情况的原因,最初的属性可能是indexed=False吗?