私はちょうど同じ問題を抱えていました。データストア内の既存のエントリに ID を割り当てないことに決め、これを行いました。これは、シャード カウンターからの totalcount が既にあるためです。
これは、 keyでソートされた "totalcount" エントリから "count" エントリを選択します。
# select $count from the complete set
numberlist = random.sample(range(0,totalcount),count)
numberlist.sort()
pagesize=1000
#initbuckets
buckets = [ [] for i in xrange(int(max(numberlist)/pagesize)+1) ]
for k in numberlist:
thisb = int(k/pagesize)
buckets[thisb].append(k-(thisb*pagesize))
logging.debug("Numbers: %s. Buckets %s",numberlist,buckets)
#page through results.
result = []
baseq = db.Query(MyEntries,keys_only=True).order("__key__")
for b,l in enumerate(buckets):
if len(l) > 0:
result += [ wq.fetch(limit=1,offset=e)[0] for e in l ]
if b < len(buckets)-1: # not the last bucket
lastkey = wq.fetch(1,pagesize-1)[0]
wq = baseq.filter("__key__ >",lastkey)
これは私にとってはやや複雑であり、off-by-one または off-by-x エラーがないことをまだ確信していないことに注意してください。
また、count が totalcount に近い場合、これは非常に高くつく可能性があることに注意してください。また、数百万行の場合、appengine の時間境界内では実行できない可能性があることに注意してください。