如何通过 Google Cloud Datastore JSON API 使用子类存储类



为了存储到 GCD 中,我想使用 Google Cloud Datastore JSON API,但我无法为具有另一个类成员的对象编写正确的Json请求正文。考虑我有2类:

public class Foo {
    private String id;
    private Bar bar;
    // getter and setter...
}
public class Bar {
    private String name;
    private String pass;
    // getter and setter...
}

然后,我创建一个包含Bar类对象的类Foo对象。所以我想将此对象插入云数据存储。我写了这个请求正文:

{
  "transaction":"some bytes",
  "mutation":{
    "insert":[
      {
        "key":{
          "partitionId":{
            "datasetId":"s~my-dataset-id"
          },
          "path":[
            {
              "kind":"Foo",
              "name":"id"
            }
          ]
        },
        "properties":{
          "bar":{
            "entityValue":{
              "name":{
                "stringValue":"Jack"
              },
              "pass":{
                "stringValue":"1234"
              }
            },
            "indexed":false
          },
          "id":{
            "stringValue":"id"
          }
        }
      }
    ]
  }
}

然后,除bar之外的所有字段都将保存到云数据存储。我使用了"entityValue",但似乎我应该包括整个实体结构(感谢Adam的提及)。但我不需要它作为另一个实体,显然我不应该使用"entityValue"。那么我应该如何更改请求正文以插入这样的对象呢?

顺便说一下,我可以通过以下请求插入一个Bar对象(但不是Foo):

   {
  "transaction":"some bytes",
  "mutation":{
    "insert":[
      {
        "key":{
          "partitionId":{
            "datasetId":"s~my-project-id"
          },
          "path":[
            {
              "kind":"Bar",
              "name":"John"
            }
          ]
        },
        "properties":{
          "pass":{
            "stringValue":"1234"
          },
          "name":{
            "stringValue":"John"
          }
        }
      }
    ]
  }
}
这是相关链接

:相关链接

您可以将Bar作为entityValue包含在内。此值看起来像普通实体,但它不需要具有键。此实体值不需要单独存在于数据存储中。

例如:

{
  "mutation":{
    "insert":[
      {
        "key":{
          "path":[
            {
              "kind":"Foo",
              "name":"id"
            }
          ]
        },
        "properties":{
          "bar":{
            "entityValue":{
              "properties": {
                "name":{
                  "stringValue":"Jack"
                },
                "pass":{
                  "stringValue":"1234"
                }
              }
            },
            "indexed":false
          },
          "id":{
            "stringValue":"id"
          }
        }
      }
    ]
  },
  "mode": "NON_TRANSACTIONAL"
}

另外作为旁注,请注意,此处Foo的键省略了partitionId。这是首选操作,数据存储将为您填写正确的partitionId

您必须包含"entityValue"的整个实体结构(包括"键"和"属性"字段)。这是因为您引用的是数据存储中的单独实体,而不仅仅是嵌入在当前实体中的另一个数据结构。看:

数据集:实体格式
https://cloud.google.com/datastore/docs/apis/v1beta2/entity

字段"entityValue":(Entity)"是一个线索,您需要从新实体的同一实体表示的开头开始。

最新更新