【问题标题】:Google App Engine NDB Sorting Loses EntitiesGoogle App Engine NDB 排序丢失实体
【发布时间】:2015-04-15 15:27:56
【问题描述】:

我正在尝试根据分数对从数据集中提取的一些实体进行排序,但目前它仅返回 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)

我拥有的当前数据集:

这会导致仅返回地点 A 而不会返回其他实体。

如何将实体从高到低排序score

PS:我用谷歌搜索了一遍,找不到任何可行的解决方案。

【问题讨论】:

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


    【解决方案1】:

    你所做的很好,所以问题在于数据本身。

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

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

    你得到的实体有 4 次写入,显然还有其他索引被写入,它必须是 score,否则你不会得到任何数据。查询仅适用于索引属性,如果过滤器属性在执行时没有索引,实体可以存在但“不可见”。

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

    无法告诉您是什么原因造成的,也许属性最初是 indexed=False

    【讨论】:

    • 是的,他们最初都是indexed=False。我刷新了数据存储并重新添加了所有内容,它现在按预期工作。感谢您清理它 - 我也对写入和索引有更好的理解。干杯!
    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多