有人可以用简单的英语解释数据存储区中的5000索引上限 这是否意味着存储对象的索引列表属性不能包含更多5000个元素?
答案 0 :(得分:10)
数据存储区限制单个实体可以拥有的索引条目数,此限制设置为每个实体5000个元素。
您可以使用以下代码段的Interactive shell轻松测试此限制:
class Model(db.Model):
x = db.ListProperty(int)
entity = Model(x = range(5001))
entity.put()
'Too many indexed properties for entity %r.' % self.key())
BadRequestError: Too many indexed properties for entity
datastore_types.Key.from_path(u'Model', 0, _app=u'shell')
答案 1 :(得分:2)
简短回答,是,如果您为该财产编制索引。
App Engine限制单个实体在索引上可以拥有的属性值的数量(行数*列数),因为它需要为每个排列创建索引。对于单个索引属性,您有5000个* 1column = 5000。
为了说明App Engine执行此操作的原因,让我们从他们的documentation中获取示例。
型号:
class MyModel(db.Model):
x = db.StringListProperty()
y = db.StringListProperty()
index.yaml中
indexes:
- kind: MyModel
properties:
- name: x
- name: y
执行
e2 = MyModel()
e2.x = ['red', 'blue']
e2.y = [1, 2]
e2.put()
在这种情况下,App Engine必须单独为此数据存储条目创建12个索引,因为您可以有效地搜索任何值组合:
x1
x2
y1
y2
x1 y1
x1 y2
x2 y1
x2 y2
y1 x1
y1 x2
y2 x1
y2 x2
现在,如果你在每个属性中有100个值,你可以想象这个列表会突然发出大量的查询。
等式是某事,如下所示:
len(x) + len(y) + (len(x)-1 * len(y) * (len(x) + len(y))) = number of indexed
**2 values per property**
2 + 2 + (1 * 2 * (2 + 2)) = 12
**100 values per property**
100 + 100 + (99 * 100 * (100 + 100)) = 1,980,200