5

查询操作 的文档IN指出,这些查询是作为大 OR'ed 相等查询实现的:

qry = Article.query(Article.tags.IN(['python', 'ruby', 'php']))

相当于:

qry = Article.query(ndb.OR(Article.tags == 'python',
                           Article.tags == 'ruby',
                           Article.tags == 'php'))

我目前正在为 GAE 项目建模一些实体,并计划使用这些具有许多可能值的成员查询:

qry = Player.query(Player.facebook_id.IN(list_of_facebook_ids))

wherelist_of_facebook_ids可以有成千上万的项目。

这种类型的查询会在列表中有数千个可能值时表现良好吗?如果不是,那么推荐的建模方法是什么?

4

2 回答 2

8

这不适用于数千个值(事实上,我敢打赌它会从超过 10 个值开始降级)。我能想到的唯一选择是某种形式的预计算。您必须更改架构。

于 2012-08-13T19:30:45.123 回答
0

一种方法是创建一个名为 FacebookPlayer 的新模型,它是一个索引。这将由 facebook_id 键入。每当您添加新播放器时,您都会更新它。它看起来像这样:

class FacebookUser(ndb.Model):
    player = ndb.KeyProperty(kind='Player', required=True)

现在您可以完全避免查询。你可以这样做:

# Build keys from facebook ids.
facebook_id_keys = []
for facebook_id in list_of_facebook_ids:
    facebook_id_keys.append(ndb.Key('FacebookPlayer', facebook_id))

keysOfUsersMatchedByFacebookId = []
for facebook_player in ndb.get_multi(facebook_id_keys):
    if facebook_player:
        keysOfUsersMatchedByFacebookId.append(facebook_player.player)
usersMatchedByFacebookId = ndb.get_multi(keysOfUsersMatchedByFacebookId)

如果 list_of_facebook_ids 是数千个项目,您应该分批执行此操作。

于 2014-03-03T01:51:28.563 回答