什么可以是数据存储区实体类型来存储和查询索引的长值

时间:2017-11-17 13:44:44

标签: google-cloud-datastore

想知道在创建实体时,在Google Cloud Datastore中存储和查询长值的最佳类型是什么。

如果我尝试将long值存储为整数,则会将其存储,但在执行查询时无法返回。查询失败是有道理的。如果我将long int值存储为字符串或浮点数,则存储和查询工作正常。

想要了解存储我想要的价值的最佳做法是什么"索引属性"。

2 个答案:

答案 0 :(得分:2)

您可以通过以下链接找到数据存储区限制。 https://cloud.google.com/datastore/docs/concepts/limits

如果您熟悉数据存储区索引的这一概念,它对您也很有用。 https://cloud.google.com/appengine/docs/standard/python/datastore/indexes

并链接到最佳实践。 https://cloud.google.com/datastore/docs/best-practices

关于您的方法,将长整数存储为字符串并仍然能够索引此类属性。对于以1500字节为单位的UTF-8大小的索引字符串存在限制。 一般来说,这是你可以存储它的唯一方法,但我可以提出其他方法来增加这个限制。

  1. 在不同的部分上拆分字符串并存储为字符串数组。
  2. 压缩生成的长字符串。
  3. 降低精度转换并存储数量(10 ^ 100)。
  4. 但是,目前无论如何,这是我能看到的唯一方式,如你所描述的那样,以字符串格式。

答案 1 :(得分:1)

我认为这是您的确切问题:

google.api_core.exceptions.InvalidArgument: 400 The value of property "{myVar}" is longer than 1500 bytes.

即使您已明确地将字段设置为不被索引,或者选择了没有索引选项的“文本”类型,插入/插入内容也会对1500字节以上的对象失败。

这是解决该问题的方法:

client = datastore.Client()
kind = 'myKind'
uniqueKey = f'{howeverYouGenerateYourKeys}'
completeKey = client.key(kind, uniqueKey)
# incompleteKey = client.key(kind)  # alternately, you could let Google generate the key id for you!
entity = datastore.Entity(key=completeKey, exclude_from_indexes=['reallyLongField'])
entity.update({
    'firstName': x.firstName,
    'lastName': x.lastName,
    'favoriteDinosaur': x.rawr,      
    'reallyLongField': x.deeeetails
})
client.put(entity)

重要的是将exclude_from_indexes添加到datastore.Entity(...)

参考:https://cloud.google.com/datastore/docs/concepts/indexes