【问题标题】:Google Cloud Datastore: Storing arrays and objectsGoogle Cloud Datastore:存储数组和对象
【发布时间】:2014-07-30 12:53:12
【问题描述】:

我刚开始学习 IndexedDB,所以 Google Cloud Datastore 的概念让我很困惑。

您究竟是如何存储数组和对象的?

考虑这种情况:

{ category: 'football', keywords: ['foo', 'bar'] }
{ dinosaurs: { trex: { teeth: 'large' } } }

我应该如何构建数据库?

在 IndexedDB 中,multiEntry 允许将数组中的所有关键字存储为单独的条目。

对于数组:如果我想按关键字搜索,是否应该使用“种类”关键字构建一个新实体并将每个关键字存储为单独的实体?我如何将它链接到它的相关类别?

对于对象:我是否应该将其存储为 JSON 字符串,然后在脚本中对其进行字符串化/解码?

【问题讨论】:

  • 将其存储为 JSON 字符串,然后在脚本中对其进行字符串化/解码是一种简单、廉价的方法。

标签: javascript google-app-engine google-cloud-datastore


【解决方案1】:

您可以根据需要使用 GSON 和序列化/反序列化:

写入实体:


     Gson g = new Gson();

      Entity entity = new Entity("dinosaurs");
      entity.setProperty("DinosaurNames", g.toJson(yourList));

      entity.build();

读取实体数据:

      Gson g = new Gson();

      Entity entity = datastore.get(key);
      Map<String, Value<?>> map = entity.getProperties();

      List<String> DinosaurNames = 
          gson.fromJson(
             map.get("DinosaurNames").get(), 
             new TypeToken<List<String>>(){}.getType()
          );

【讨论】:

    【解决方案2】:

    在 HTTP API 中,一个 Value 可以包含一个值列表:

    {properties: {keywords: {list_value: [{string_value: 'foo'}, ...]}}}
    

    或实体:

    {
      properties: {
        dinosaurs: { 
          entity_value: {
            properties: { 
              'trex': {entity_value: {properties: {teeth: {string_value: 'large'}}}
            }
          }
        }
      }
    }
    

    (注意 entity_value 的当前无法被索引)

    【讨论】:

    【解决方案3】:

    您可以将字符串列表保存在单个属性中。该属性可以是索引的,也可以是未索引的。

    对于一个对象,你创建一个实体:

    Entity entity = new Entity("dinosaurs");
    entity.setProperty("type", "trex");
    entity.setUnindexedProperty("teeth", "large");
    

    通过这种方式,您可以指明要索引哪些属性(额外费用),以及要取消索引的属性。

    上面的示例使用Java Datastore API,但您也可以使用Objectify 之类的框架来管理您的对象和实体。

    Datastore 上有相当不错的文档,并且有很多 examples/tutorials 可用。

    【讨论】:

    • 如果列表存储为字符串,我将如何查询特定关键字?例如,我想要所有包含关键字“foo”的条目。
    • 如果你把它存储为一个字符串,然后做一个JSON.loads,你可以遍历每一个。 some_var = json.loads(my_JSON_str.json)this_val= some_var['keywords'].get('foo')if this_val...。但是,这更昂贵且效率低下。如果要在数据存储中查询包含“foo”的项目,则需要对该查询进行索引,并将属性作为属性存储在数据存储中。
    • 最后一句,是不是像keywords: { foo: 'football' }这样的意思?
    • 您在过滤器中使用简单的 FilterOperator.EQUAL:App Engine 会将您正在搜索的值与列表中的每个值进行比较。
    • 没有。它分别存储每个值 - 数据存储允许同一属性具有多个值。如果此属性已编入索引,则每个值也会记录在此类/属性的索引中,可以通过查询找到该索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2018-11-22
    • 2020-10-03
    • 2018-11-18
    • 2019-02-16
    • 2018-12-29
    相关资源
    最近更新 更多