Python 数据存储中现有实体的复合索引写入

Python 数据存储中现有实体的复合索引写入,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我有一个模型: class MyModel(db.Model): some_list = db.StringListProperty(indexed=True) some_value = db.StringProperty(indexed=True) 和一个综合指数: indexes: - kind: MyModel properties: - name: some_list - name: some_value 如果我创建了一个新实体: entity = MyModel

我有一个模型:

class MyModel(db.Model):
  some_list = db.StringListProperty(indexed=True)
  some_value = db.StringProperty(indexed=True)
和一个综合指数:

indexes:
- kind: MyModel
  properties:
  - name: some_list
  - name: some_value
如果我创建了一个新实体:

entity = MyModel(some_list=['a', 'b'], some_value='xxx')
然后我将其放入数据存储:

key = entity.put()
这将导致

  • 2次写入(在本例中为2次写入)
  • 每个索引属性值写入2次(在本例中为2+4次写入)
  • 每个复合索引值写入1次(在本例中为2次写入)
在这种情况下,总共有10次写入。到目前为止,我明白了

但现在我得到了现有属性,将“c”添加到某个_列表中并将其放回:

existing = MyModel.get(key)
existing.some_list.append('c')
existing.put()
这是多少数据存储写入

文件说:

每个修改的索引属性值1次写入+4次写入+2次修改的复合索引值写入

这是否意味着不需要重写某些_列表中“a”和“b”的索引:

1+4+2=7次写入

或者某个列表中“a”和“b”的索引是否因为某个列表发生了更改而被重写:

1+12+6=19次写入

(不含综合指数)appstats显示以下
账单运营

第一票:

@2ms数据存储\u v3.Put real=169ms api=0ms成本=800计费\u操作=[数据存储\u写入:8]

  • 1写入实体表
  • 1填写种类索引表
  • 2写入索引表(asc/desc)
  • 4写入
    some_list
    索引表(每个附加值2个,asc/desc)
第二次出售(更新):

@187ms数据存储\u v3.Put real=50ms api=0ms成本=300计费\u操作=[数据存储\u写入:3]

  • 1写入实体表
  • 在索引表中写入2条代码(每个附加值2条,asc/desc)
文档称
4次写入每个修改的索引属性值
,但由于每个列表属性元素都有自己的索引行(每个值1行),添加一个元素相当于创建新的索引属性(而不是修改一个)

但是,如果修改某些值,这将导致:

@484ms数据存储\u v3.Put real=46ms api=0ms成本=500计费\u操作=[数据存储\u写入:5]

  • 1写入实体表
  • 4次写入
    some_value
    索引表(2次写入用于删除现有行asc/desc,2次写入用于添加新行asc/desc)
    • (不含综合指数)appstats显示以下
      账单运营

      第一票:

      @2ms数据存储\u v3.Put real=169ms api=0ms成本=800计费\u操作=[数据存储\u写入:8]

      • 1写入实体表
      • 1填写种类索引表
      • 2写入索引表(asc/desc)
      • 4写入
        some_list
        索引表(每个附加值2个,asc/desc)
      第二次出售(更新):

      @187ms数据存储\u v3.Put real=50ms api=0ms成本=300计费\u操作=[数据存储\u写入:3]

      • 1写入实体表
      • 在索引表中写入2条代码(每个附加值2条,asc/desc)
      文档称
      4次写入每个修改的索引属性值
      ,但由于每个列表属性元素都有自己的索引行(每个值1行),添加一个元素相当于创建新的索引属性(而不是修改一个)

      但是,如果修改某些值,这将导致:

      @484ms数据存储\u v3.Put real=46ms api=0ms成本=500计费\u操作=[数据存储\u写入:5]

      • 1写入实体表
      • 4次写入
        some_value
        索引表(2次写入用于删除现有行asc/desc,2次写入用于添加新行asc/desc)

      我也用复合索引对其进行了测试,第二次put显示总共有4次写入,这意味着复合索引只需要额外写入一次。“a”和“b”的复合索引没有被触及。我也用复合索引对其进行了测试,第二次put显示总共有4次写入,这意味着复合索引只需要额外写入一次。不涉及“a”和“b”的综合指数。