在 Google Cloud Datastore 上使用动态类型

Posted

技术标签:

【中文标题】在 Google Cloud Datastore 上使用动态类型【英文标题】:Working with dynamic types on Google Cloud Datastore 【发布时间】:2019-06-08 05:31:47 【问题描述】:

我们的应用程序目前正在使用 MongoDb。我们的计划是让它与 Datastore 一起使用。在我们的应用程序中,有一些 API 调用,我们不知道它的响应是如何构造的。因此,我们使用动态类型。我们得到响应并按原样将其放到 Mongodb 中。

据我们研究,Google.Cloud.Datastore.V1 .Net SDK 推动开发人员使用结构化类型。我们必须创建一个实体,该实体具有具有预定义键名的某些属性。

如下图:

        MapField<string, Value> fields = new MapField<string, Value>();
        fields.Add("d1", "string value");
        fields.Add("d2", 30);
        fields.Add("d3", 55);

        var entity = new Entity
        
            Key = key,
            Properties =  fields 
        ;

我已经尝试过为字段设置 API 响应。不幸的是,它最终将响应保存为字符串。

有没有办法实现它?

【问题讨论】:

我了解到您正在 Datastore 中创建一个实体,从 API 调用到 C# 应用程序,该实体是根据输入请求参数使用动态字段创建的。您能否分享一个您可能在此应用程序中收到的示例 API 请求,以及您期望在 Datastore 中创建的内容与您获得的内容? 让我清除它。 gist.github.com/onuar/728e498db627ecae1d0d10e9639643ce 正如你在上面看到的,我有一个名为 mockedApiResponse 的动态对象,我不知道里面有什么。举个例子,只有三个键,但会有更多。这样,SDK 保存如下:imgur.com/fUasyHL 而且我无法按数字、str 或数组进行过滤。为了让它发挥作用,我必须这样做:gist.github.com/onuar/95ca8fabf929d822849cdd8310313731imgur.com/atuCN4C 它运作良好。但问题是,我必须知道 dJson 的属性(键)。 【参考方案1】:

查看文档 Properties and Value Types 中的此页面,特别是名为 Embedded entity 的位,它允许您存储 JSON 实体,然后只要它被索引就可以查询它的子属性.

【讨论】:

谢谢阿曼达。但是在 .Net SDK 中,没有像 EmbeddedEntity 这样的东西。我能够通过实体(内部实体)传递实体。但它只是另一个实体。因此它不会被索引。 @onuradam 你解决了这个问题吗,如果是,请分享解决方案,我也面临同样的问题。【参考方案2】:

如果您考虑到不需要使用Properties 实体键,我相信问题会得到简化。

根据您的示例,我做了以下操作。请注意,我不是您将看到的C# 专家,但这确实成功了:

string projectId = "MY-PROJECT";
string kind = "Task";
string name = "samplekey1";

DatastoreDb db = DatastoreDb.Create(projectId);

KeyFactory keyFactory = db.CreateKeyFactory(kind);

Key key = keyFactory.CreateKey(name);

var request = JObject.Parse("number:1000, str:'string', array: [1,2,3,4,5,6]");

var entity = new Entity()

    Key = key,
;

foreach(JProperty property in request.Properties())

    entity[property.Name] = property.Value.ToString();



using (DatastoreTransaction transaction = db.BeginTransaction())

    transaction.Insert(entity);
    transaction.Commit();
;

请注意,这不会保存每个键的值的类型(它们都将是字符串)。如果您不需要稍后使用每个值的类型(即 Int、String...),这不是问题。

但这似乎是最简单的解决方案,它完成了创建 each property with each value 的工作。

【讨论】:

感谢您的帮助,但它无法正常工作。因为数据类型和嵌套对象。对于没有 json 或动态类型作为参数的 NoSQL 数据库,这不是很奇怪吗?

以上是关于在 Google Cloud Datastore 上使用动态类型的主要内容,如果未能解决你的问题,请参考以下文章

在 Google Cloud Datastore 上使用动态类型

在 Google Cloud Datastore 与 Google Cloud Bigtable 中存储用户事件历史记录

无法连接到本地 Google Cloud Datastore 模拟器

使用 google Cloud Datastore 在所有用户之间共享数据

Google Cloud Datastore Emulator 如何验证我们的 datastore-index.xml?

Google Cloud Datastore 客户端库创建实体