2017-03-22 26 views
0

說我在谷歌App Engine的數據存儲以下模型:谷歌App Engine的資料儲存庫查詢和獲取相對排名

class Post(ndb.Model): 
    name = ndb.StringProperty() 
    votes = ndb.IntegerPropery() 

我想先查詢後得到的選票數量排序的所有帖子(最高到最低),然後找到名稱爲「John」的郵政排名/地點。 因此,如果約翰郵政獲得第二票數,他將在第二名。

有沒有簡單的方法來做到這一點? 現在我做這樣的事情:

posts = Post.query().order(-Post.votes) 
for post, index in enumerate(posts): 
    if post.name == "John": 
    print(index) 

我想這是不是要做到這一點非常好/有效的方式。

回答

0

如果帖子總數非常高,這些名爲John是幾個吧可能是更有效地做這樣的事情:

total_posts = len(Post.query().fetch(keys_only=True)) 

john_posts = Post.query(Post.name == 'John') 
for post in john_posts: 
    # find out how many posts have higher votes than this post 
    rank = len(Post.query(Post.votes > post.votes).fetch(keys_only=True)) 
    print('%d out of %d' % (rank, total_posts)) 

這也將是更便宜,因爲你會從數據庫中只讀約翰命名的帖子(付費數據庫操作) - keys_only查詢是免費的。

雖然它不是總列表中的實際索引,但對於具有相同票數的帖子您將獲得相同的排名。