NDB数据存储禁止对不同属性的多个不等式查询。为了解决这个问题,我认为解决方案可能是将多个独立查询的结果结合起来。我找到了推荐geohashing的2011年的问题,我对此并不熟悉。所以,也许今天有一个更好的解决办法。
考虑以下两个问题:
q1 = User.query(User.age < 18).fetch()
q2 = User.query(User.city != 'New York City').fetch()我试图像这样加入他们:
results = set(q1).intersection(q2)然而,我遇到了TypeError: Model is not immutable。
我的问题:
TypeError?谢谢你的帮助。
发布于 2015-11-06 18:16:11
如果您可以重构您的User模型,您可以添加更多的属性来简化查询。例如,如果查询相同的年龄范围,则生成一个对范围进行编码的属性:
age_range = ndb.IntegerProperty() # 0 = 0-17, 1 = 18-29, 2 = 30-39, etc.然后你就可以拥有:
q1 = User.query(User.age_range == 0).query(User.city != 'New York City').fetch()如果数据集足够小,可以使用@TimHoffman的方法:
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库,它将扩展到大数据集。您可以设置多个过滤器来减少数据集。
发布于 2016-03-31 13:47:49
我也有过类似的问题。我的问题是:
@classmethod:
def getUnReadMessages(cls, user, date)
return cls.query(ndb.AND(cls.created <= date,
cls.receiver_key == user.key,
cls.status != READ))但appengine不让我这么做。因此,我解决了将一个不等式改为:
@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)))问题解决了!希望这能帮到你。
发布于 2017-10-18 21:35:16
有两种选择:
更改数据模型
添加更多属性或调整当前属性,以便根据数据存储的限制查询对象。这可能意味着对连续变量进行分类。
找个解决办法
您可以首先进行最重要的查询,然后手动筛选结果。考虑到以下几点:
代码可能如下所示:
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)或
query = [u for u in User.query(User.age < 18).fetch() if u.city != 'New York City']https://stackoverflow.com/questions/33549573
复制相似问题