【发布时间】:2012-08-13 14:57:02
【问题描述】:
使用 NDB,可以为查询指定 projection,从而限制为匹配查询的实体检索的属性数量。
但是,我在文档中找不到任何关于在使用 ndb.get_multi() 时如何指定投影的内容,它总是获取完整的实体。
在使用ndb.get_multi() 时,有没有办法只获取某些属性?
【问题讨论】:
标签: google-app-engine app-engine-ndb
使用 NDB,可以为查询指定 projection,从而限制为匹配查询的实体检索的属性数量。
但是,我在文档中找不到任何关于在使用 ndb.get_multi() 时如何指定投影的内容,它总是获取完整的实体。
在使用ndb.get_multi() 时,有没有办法只获取某些属性?
【问题讨论】:
标签: google-app-engine app-engine-ndb
不,投影功能仅适用于查询。投影 get() 操作没有优势(就更少的 I/O 操作而言)。
【讨论】:
我最终遇到了这样一种情况:使用 ndb.get_multi() 的投影确实可以提高性能。我有一个具有约 25 个属性的大型实体类,其中一些甚至是重复的。我需要 get_by_id 大约 10 个对象来为我的应用程序中的每个网页提供服务,但每个对象只需要 4 个属性。如果我使用普通的ndb.get_multi() 实现这一点,那么大约一半的前端 CPU 时间最终会花在一个名为 Model._from_pb 的 NDB API 方法中,即反序列化从数据库中读取的对象。这看起来可以通过投影来改进,实际上,在我使用投影的情况下,以下方式将整体响应时间缩短了一半:
Product.query(Product.key.IN(keys_to_get)).fetch(projection=list_of_columns)
Product 是我的实体类的名称。当然,在这种情况下,查询需要一个新索引。
【讨论】: