Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 组合多个ndb不等式查询的结果_Google App Engine_Google Cloud Datastore_App Engine Ndb_Endpoints Proto Datastore - Fatal编程技术网

Google app engine 组合多个ndb不等式查询的结果

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:模型不是一成不变的 我的问题是: 有没有更好的方法来处理不同

NDB数据存储禁止对不同属性进行多个不等式查询。为了解决这个问题,我认为解决方案可能是组合多个独立查询的结果。我找到了推荐Geohash的方法,但我并不熟悉。因此,也许今天有更好的解决办法

考虑以下两个问题:

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']