具有结构化属性和投影的NDB查询会产生意外结果

时间:2016-09-17 13:34:04

标签: python-2.7 google-app-engine database-design google-cloud-datastore app-engine-ndb

嗨,我有这些模特:

class TagProprieta(ndb.Model):
    tag = ndb.StringProperty()
    stato =  ndb.StringProperty()

class RegDevice(ndb.Model):
    comune_key = ndb.KeyProperty()
    reg_id = ndb.StringProperty()
    tags = ndb.StructuredProperty(TagProprieta, repeated=True)
    ....

此查询返回预期结果(包含一些RegDevice对象的列表):

    registration_ids = models.RegDevice.query(\
        models.RegDevice.comune_key==comune_key,\
        models.RegDevice.tags == models.TagProprieta(tag=tag, stato='1')\
        ).fetch()

因为我只需要字段reg_id,所以我改变了最后一行:

.fetch(projection=[models.RegDevice.reg_id])

结果是一个空列表:[]

如果由于NDB的限制,我会非常好并且错误,但在我看来,空列表不是正确的。 我做错了吗?我是唯一使用前一个查询的机会,然后在内存中处理结果吗? THX

2 个答案:

答案 0 :(得分:2)

必须为reg_id编制索引,才能使投影正常工作。

https://cloud.google.com/appengine/docs/standard/python/ndb/projectionqueries#Python_Limitations_on_projections

尝试在index.yaml

中手动设置
- kind: RegDevice
  properties:
  - name: reg_id

答案 1 :(得分:0)

试试这个:

registration_ids = models.RegDevice.query(\
    models.RegDevice.comune_key==comune_key,\
    models.RegDevice.tags == models.TagProprieta(tag=tag, stato='1'),\
    projection=[models.RegDevice.reg_id]
    ).fetch()