【问题标题】:Google cloud datastore object trees from json来自 json 的谷歌云数据存储对象树
【发布时间】:2026-01-29 05:40:01
【问题描述】:

我可能遗漏了一些明显的东西,但我找不到一种方法来存储带有后代的 JSON 对象,从而使 Datastore DB 具有可查询的实体层次结构。示例代码:

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);

如果我现在检查我的数据存储区,它包含一个 Array 类型的实体“obj”(如预期的那样),但值是一个表示该数组的大 JSON blob,即我无法深入到后代对象(它们是 @987654322 @、obj[1]obj[1].var3obj[1].var3[0]) 来自 Datastore 控制台(而使用 AWS DynamoDB 和相同的 JSON,我可以向下钻取——就好像它自动处理从 JS 对象到 DB 格式的转换一样)。然而,文档表明实体的父实体在创建实体后无法更改,因此必须在子实体之前创建父实体。似乎 API 要求我分多个步骤保存:

  1. 保存根对象,列表为空
  2. 保存根的每个孩子,将他们的父母设置为根(obj);不清楚如何将每个孩子添加到数组中; obj[1] 将有空数组作为 var3 属性值
  3. 保存obj[1].var3数组的每个元素,将它们的父元素设置为obj[1];关于数组的同样问题

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

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

【问题讨论】:

    标签: json node.js google-cloud-datastore google-api-nodejs-client


    【解决方案1】:

    恕我直言,如果不指定结构化格式,就不可能以结构化格式自动存储 json 数据 - 如何确定特定数据部分是否应该确实是单独的实体或直接转储在同一实体中? - 根据应用程序,任何一个都可能是可取的。

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

    我看到 go 也支持 Structured Properties,但我没有找到关于查询和批量填充它们的好的参考。来自Properties and value types

    您还可以使用structslice 来聚合属性。看 the Cloud Datastore reference 了解更多详情。

    这将是一个类似的问题,但对于 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

    【讨论】:

      【解决方案2】:

      你说:

      "实体创建后不能更改实体的父级,因此 父实体必须在子实体之前创建”

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

      “因为它是实体键的一部分,所以标识符是关联的 永久保存在实体中,并且无法更改。" [1]

      还有:

      "当你创建一个实体时,你可以选择指定另一个 作为其母公司的实体;新实体是父实体的子实体 (请注意,与文件系统不同,父实体不需要 确实存在)。”[2]

      无论如何,如果您无法使用您的语言 (Node.js) 以您想要的方式工作,并且 Dan Cornilescu 提供的解决方案对您来说还不够(或者即使是),您也可以随时在此处打开未来的请求关于您在 Google 的 issuetracker 中对 Cloud Datastore 的担忧,其中包含“Public Trackers > Cloud Platform > Storage and Databases > 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

      【讨论】:

        最近更新 更多