Google 云数据存储 object 棵树来自 json

Google cloud datastore object trees from json

我可能遗漏了一些明显的东西,但我找不到一种方法来存储 JSON object 与后代的数据存储数据库具有实体层次结构的方式可以查询。示例代码:

const Datastore = require('@google-cloud/datastore');
const datastore = new Datastore({
  projectId: 'MY_PROJECT_ID',
});

const ot1 = {
  // The kind and ID for the new entity
  key: datastore.key(['OT', '1']),
  data: {
    obj: [
      {
        var1: 'var1',
        var2: 'var2',
      },
      {
        var3: [{obj2:'var3'}, 'var5'],
        var4: 'var4',
      },
    ] // obj
  } // data
};

datastore.save(ot1);

如果我现在检查我的数据存储,它包含一个数组类型的实体 'obj'(正如预期的那样),但值是一个表示数组的大 JSON blob,即我无法向下钻取从数据存储控制台(而使用 AWS DynamoDB 和相同的 JSON,我能够向下钻取——就好像它自动处理从 JS objects 到 DB 格式的转换)。然而,文档表明实体的 parent 在实体创建后无法更改,因此 parent 实体必须在 child 实体之前创建。 API 似乎需要我分多个步骤保存:

  1. 保存根 object,空列表
  2. 保存root的每个child,设置他们的parent为root(obj);不清楚如何将每个 child 添加到数组; obj[1] 将有空数组作为 var3 属性 值
  3. 保存obj[1].var3数组的每个元素,将它们的parent设置为obj[1];关于 array
  4. 的相同问题

这是一项 很多 的工作,肯定有一个库函数可以自动执行此操作,但我找不到。而且我不确定这在 Datastore 控制台中会是什么样子,我怀疑您最终会得到 4 objects,即只能通过观察 parent 属性间接知道层次结构。

Update:我怀疑答案是使用像 js-data 这样的 ORM。

恕我直言,在不指定结构化格式的情况下,不可能以结构化格式自动存储 json 数据 - 如果特定数据部分确实应该是一个单独的实体或直接转储到同一个实体? - 根据应用,可以选择任何一种。

不完全确定 go(我不是 go 用户),但 python 支持 Structured Properties,允许在 属性 级别以下查询。

我看到 go 支持 Structured Properties as well, but I found no good reference about querying and bulk-filling them. From Properties and value types:

You can also use a struct or slice to aggregate properties. See the Cloud Datastore reference for more details.

这将是一个有点类似的问题,但是对于 python(它确实涉及指定结构化格式):What is the best practice to populate a StructuredProperty through the ndb.Model constructor? 也许 类似的方法可以在go中应用。

认为这也可能是相关的:datastore: retrieving an entity's key as a struct field #453

你说:

"the parent of an entity cannot be changed after entity created, so the parent entity has to be created before the child entity"

但我认为它不完全是这样,因为文档说...

"Because it is part of the entity's key, the identifier is associated permanently with the entity and cannot be changed." [1]

还有:

"When you create an entity, you can optionally designate another entity as its parent; the new entity is a child of the parent entity (note that unlike in a file system, the parent entity need not actually exist)." [2]

无论如何,如果您无法使用您的语言 (Node.js) 工作,并且 Dan Cornilescu 提供的解决方案对您来说还不够(或者即使是),您也可以随时打开关于您在 Google 的 issuetracker 和组件 "Public Trackers > Cloud Platform > Storage and Databases > Cloud Datastore" 中的 Cloud Datastore 问题的未来请求(例如 [3]

1.- https://cloud.google.com/datastore/docs/concepts/entities#kinds_and_identifiers

2.- https://cloud.google.com/datastore/docs/concepts/entities#ancestor_paths

3.- https://issuetracker.google.com/issues/new?component=187197&template=1010240