在 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?