Google app engine 组合多个ndb不等式查询的结果
NDB数据存储禁止对不同属性进行多个不等式查询。为了解决这个问题,我认为解决方案可能是组合多个独立查询的结果。我找到了推荐Geohash的方法,但我并不熟悉。因此,也许今天有更好的解决办法 考虑以下两个问题:Google app engine 组合多个ndb不等式查询的结果,google-app-engine,google-cloud-datastore,app-engine-ndb,endpoints-proto-datastore,Google App Engine,Google Cloud Datastore,App Engine Ndb,Endpoints Proto Datastore,NDB数据存储禁止对不同属性进行多个不等式查询。为了解决这个问题,我认为解决方案可能是组合多个独立查询的结果。我找到了推荐Geohash的方法,但我并不熟悉。因此,也许今天有更好的解决办法 考虑以下两个问题: q1 = User.query(User.age < 18).fetch() q2 = User.query(User.city != 'New York City').fetch() 然而,我遇到了TypeError:模型不是一成不变的 我的问题是: 有没有更好的方法来处理不同
q1 = User.query(User.age < 18).fetch()
q2 = User.query(User.city != 'New York City').fetch()
然而,我遇到了TypeError:模型不是一成不变的
我的问题是:
- 有没有更好的方法来处理不同属性上的多个不等式过滤器
- 如果没有,我如何解决上面的
类型错误
谢谢您的帮助。如果您可以重新构造您的
用户
模型,您可以添加更多属性以简化查询。例如,如果查询相同的年龄范围,则创建对这些范围进行编码的属性:
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))
q1=User.query(User.age<18).fetch(keys\u only=True)
q2=User.query(User.city!=“newyorkcity”).fetch(keys\u only=True)
结果=ndb.get_multi(集合(q1).交集(q2))
图书馆是一种更为重要的方法,可以扩展到大数据集。您可以加入多个过滤器以减少数据集。我也遇到过类似的问题。我的问题是:
@classmethod:
def getUnReadMessages(cls, user, date)
return cls.query(ndb.AND(cls.created <= date,
cls.receiver_key == user.key,
cls.status != READ))
@classmethod:
def GetUnderMessages(cls、用户、日期)
返回cls.query(ndb.AND(cls.created)有两个选项:
更改数据模型
添加更多属性或调整当前属性,以便您可以根据数据存储的限制查询对象。这可能意味着对连续变量进行分类
找到解决办法
您可以先进行最重要的查询,然后手动筛选结果。请记住以下注意事项:
- 您可以使用来提高查询的效率
- 使结果可测试(iter)
- 使用get_multi获取密钥列表
您的代码可能如下所示:
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 iter=User.query(User.age<18).iter(projection=[User.city])
query_keys=[u.key()表示查询中的u\u iter if u.city!='New York city']
query=ndb.get\u multi(查询键)
或
query=[User.query(User.age<18.fetch(),如果u.city!=“纽约市”]
它可能有点重复。我读过这个答案,很好奇如何能够组合多个查询,这是我在这个问题中部分要问的问题。如果只执行键查询,效率会更高,您可以根据键创建集,然后只获取唯一的集。(虽然ndb缓存也可以节省效率)但正如您所发现的,您无法创建一组模型。因此,请回到键。
@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)))
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']