在Google Cloud Datastore上使用动态类型

时间:2019-01-14 08:30:13

标签: c# dynamic google-cloud-platform google-cloud-datastore

我们的应用程序当前正在MongoDb上运行。我们的计划是使其与数据存储一起使用。在我们的应用程序中,有一些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响应设置为字段。不幸的是,它最终将响应保存为字符串。

反正有实现吗?

2 个答案:

答案 0 :(得分:0)

我认为,如果您考虑到不需要使用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的工作。

答案 1 :(得分:0)

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