Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 谷歌云数据存储:存储阵列和对象_Javascript_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Javascript 谷歌云数据存储:存储阵列和对象

Javascript 谷歌云数据存储:存储阵列和对象,javascript,google-app-engine,google-cloud-datastore,Javascript,Google App Engine,Google Cloud Datastore,我刚刚学习IndexedDB,所以Google云数据存储的概念让我很困惑 如何准确地存储数组和对象 考虑以下情况: { category: 'football', keywords: ['foo', 'bar'] } { dinosaurs: { trex: { teeth: 'large' } } } 我应该如何构造数据库 在IndexedDB中,您有多条目,它允许将数组中的所有关键字存储为单独的条目 对于数组:如果我想按关键字搜索,我是否应该用“种类”关键字构建一个新实体,并将每个关键字存

我刚刚学习IndexedDB,所以Google云数据存储的概念让我很困惑

如何准确地存储数组和对象

考虑以下情况:

{ category: 'football', keywords: ['foo', 'bar'] }
{ dinosaurs: { trex: { teeth: 'large' } } }
我应该如何构造数据库

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

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


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

您可以在单个属性中保存字符串列表。此属性可以索引,也可以取消索引

对于对象,可以创建一个实体:

Entity entity = new Entity("dinosaurs");
entity.setProperty("type", "trex");
entity.setUnindexedProperty("teeth", "large");
{
  properties: {
    dinosaurs: { 
      entity_value: {
        properties: { 
          'trex': {entity_value: {properties: {teeth: {string_value: 'large'}}}
        }
      }
    }
  }
}
通过这种方式,您可以指示要为哪些属性编制索引(额外费用),以及要取消为哪些属性编制索引

上面的示例正在使用,但您也可以使用类似的框架来管理对象和实体


关于数据存储,有相当好的文档,并且有很多可用文档。

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

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

Entity entity = new Entity("dinosaurs");
entity.setProperty("type", "trex");
entity.setUnindexedProperty("teeth", "large");
{
  properties: {
    dinosaurs: { 
      entity_value: {
        properties: { 
          'trex': {entity_value: {properties: {teeth: {string_value: 'large'}}}
        }
      }
    }
  }
}

(请注意,实体值当前无法编制索引)

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

写入实体:


Gson g=新的Gson();
实体=新实体(“恐龙”);
setProperty(“恐龙名称”,g.toJson(yourList));
entity.build();
读取实体数据:

Gson g=new Gson();
实体=datastore.get(key);

映射将其存储为JSON字符串,然后在脚本中对其进行字符串化/解码是一种简单、廉价的方法。如果列表存储为字符串,我将如何查询特定关键字?例如,我想要包含关键字“foo”的所有条目。如果您将其存储为字符串,然后执行
JSON.loads
,您可以循环每个条目
some\u var=json.load(my\u json\u str.json)
this\u val=some\u var['keywords'].get('foo')
如果this\u val…
。但是,这样做成本更高,效率更低。如果要在数据存储中查询包含“foo”的项,则需要对该查询进行索引,并将属性作为属性存储在数据存储中。最后一句话,这是否表示类似
关键字:{foo:'football'}
?您使用一个简单的筛选器运算符。筛选器中的EQUAL:App Engine会将您正在搜索的值与列表中的每个值进行比较。否。它分别存储每个值-数据存储允许同一属性具有多个值。如果此属性已编制索引,则每个值也会记录在此类/属性的索引中,在该索引中可以通过查询找到。