1

所以这段代码:

all_nodes = Nodes.query()
country_nodes = []
for n in all_nodes:
    country_nodes.append([n.country, all_nodes.filter(Nodes.country == n.country).count()])

甚至没有完成操作就取消了我的Datastore Small Operations配额?

获取上述列表的正确方法是什么?

4

2 回答 2

1

在 GAE 中,最好在编写新记录时跟踪每个国家/地区的总数。然后,您可以单次阅读以找出国家/地区的总数。例如,您可以添加一个新的模型类型:

class Country(db.Model):
    name = db.StringProperty()
    count = db.IntegerProperty()

然后,当您添加一个新节点时,您可以获得相应的Country记录并增加其count属性。

在您的示例中,当您这样做时,您正在为每个inall_nodes.filter(...)运行一个新查询。以下,应该是计算总数的一种更便宜的方法。但是当您编写新记录时,它可能比跟踪国家总数更昂贵。nall_nodes

from collections import defaultdict

country_nodes = defaultdict(int)
for n in Nodes.query():
    country_nodes[n.country] += 1
于 2013-05-13T13:13:31.473 回答
0

Use limit=n (n=the minimal You can afford) in count() or fetch() For, example, to look if there exist any record use count(limit=1) Also filter() on index does count() minimal. It is very easy to get "Datastore Small Operations quota exceeded" in a large database of records. Always think on how many records there could be in result, or will be processed nonindexed inside :)

于 2015-01-18T19:13:43.790 回答