首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组合多个ndb不等式查询的结果

组合多个ndb不等式查询的结果
EN

Stack Overflow用户
提问于 2015-11-05 16:14:59
回答 3查看 1K关注 0票数 0

NDB数据存储禁止对不同属性的多个不等式查询。为了解决这个问题,我认为解决方案可能是将多个独立查询的结果结合起来。我找到了推荐geohashing的2011年的问题,我对此并不熟悉。所以,也许今天有一个更好的解决办法。

考虑以下两个问题:

代码语言:javascript
复制
q1 = User.query(User.age < 18).fetch()
q2 = User.query(User.city != 'New York City').fetch()

我试图像这样加入他们:

代码语言:javascript
复制
results = set(q1).intersection(q2)

然而,我遇到了TypeError: Model is not immutable

我的问题:

  • 是否有更好的方法来处理不同属性上的多个不等式过滤器?
  • 如果没有,我如何解决上面的TypeError

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-06 18:16:11

如果您可以重构您的User模型,您可以添加更多的属性来简化查询。例如,如果查询相同的年龄范围,则生成一个对范围进行编码的属性:

代码语言:javascript
复制
age_range = ndb.IntegerProperty()    # 0 = 0-17, 1 = 18-29, 2 = 30-39, etc.

然后你就可以拥有:

代码语言:javascript
复制
q1 = User.query(User.age_range == 0).query(User.city != 'New York City').fetch()

如果数据集足够小,可以使用@TimHoffman的方法:

代码语言:javascript
复制
q1 = User.query(User.age < 18).fetch(keys_only=True)
q2 = User.query(User.city != 'New York City').fetch(keys_only=True)
results = ndb.get_multi(set(q1).intersection(q2))

一个更重要的方法是MapReduce库,它将扩展到大数据集。您可以设置多个过滤器来减少数据集。

票数 2
EN

Stack Overflow用户

发布于 2016-03-31 13:47:49

我也有过类似的问题。我的问题是:

代码语言:javascript
复制
@classmethod:
def getUnReadMessages(cls, user, date)
    return cls.query(ndb.AND(cls.created <= date,
                             cls.receiver_key == user.key,
                             cls.status != READ))

但appengine不让我这么做。因此,我解决了将一个不等式改为:

代码语言:javascript
复制
@classmethod:
def getUnReadMessages(cls, user, date)
    return cls.query(ndb.AND(cls.created <= date,
                             cls.receiver_key == user.key,
                             ndb.OR(cls.status == SEND,
                                    cls.status == RECEIVED)))

问题解决了!希望这能帮到你。

票数 0
EN

Stack Overflow用户

发布于 2017-10-18 21:35:16

有两种选择:

更改数据模型

添加更多属性或调整当前属性,以便根据数据存储的限制查询对象。这可能意味着对连续变量进行分类。

找个解决办法

您可以首先进行最重要的查询,然后手动筛选结果。考虑到以下几点:

  • 您可以使用投影来提高查询效率。
  • 使结果可迭代(iter)。
  • 使用get_multi作为密钥列表。

代码可能如下所示:

代码语言:javascript
复制
query_iter = User.query(User.age < 18).iter(projection=[User.city])
query_keys = [u.key() for u in query_iter if u.city != 'New York City']
query = ndb.get_multi(query_keys)

代码语言:javascript
复制
query = [u for u in User.query(User.age < 18).fetch() if u.city != 'New York City']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33549573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档