【问题标题】:Google App Engine fetching based on values in listGoogle App Engine 根据列表中的值进行提取
【发布时间】:2012-04-15 14:52:46
【问题描述】:

有什么方法可以在 GAE 中进行查询,其中我有一个 userId 的 list,并且我想在 list 中使用 userId 获取所有 User。

类似query.filter("userId IN", userIdList)

如果这不可能,最接近的选择是什么?

【问题讨论】:

    标签: database google-app-engine


    【解决方案1】:

    如果您通过键获取而不是运行查询,这很简单。如果您的用户对象将其用户 ID 作为其实体键,那么您可以这样做:

    # assume userIdList is a list of ints that are entity key ids
    user_keys = [ndb.Key('User', k) for k in userIdList]
    users = ndb.get_multi(user_keys)
    

    【讨论】:

    • 好吧,我的用户 ID 列表实际上是通过电子邮件发送的,所以它是一个字符串列表。现在的问题是:通过键获取比仅通过任意用户 ID(在这种情况下是该用户的电子邮件)获取更有效吗?按键获取是否会减少读取次数?
    • 我已经问过一个单独的问题:stackoverflow.com/questions/10164283/…
    • 在这里按键获取特别有效,因为“IN”查询计算为列表中每个项目的单独查询。因此,不是 N 个查询(每个查询都读取一个索引,然后获取匹配的实体),而是进行一次批量获取。
    【解决方案2】:

    您的代码完全正确。 IN 运算符就是为此目的而存在的。你试过了吗?

    https://developers.google.com/appengine/docs/python/datastore/queries

    【讨论】:

    • 您确定可以查询/过滤键名/ID吗?
    • 哦,我没有意识到这是实体的 ID。其实你仍然可以通过元数据查询:developers.google.com/appengine/docs/python/datastore/…
    • 但是,正如@mjibson 建议的那样,你最好只使用multi get。
    • 嗯,它们不是关键 ID,它实际上只是用户电子邮件的列表,但由于它们是唯一的,我称它们为 ID。我是不是通过按键获取比通过用户电子邮件更好?
    • 我已经问过一个单独的问题:stackoverflow.com/questions/10164283/…
    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    相关资源
    最近更新 更多