Работа с динамическими типами в Google Cloud Datastore - PullRequest
0 голосов
/ 14 января 2019

Наше приложение в настоящее время работает на 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 на поле. К сожалению, это привело к сохранению ответа в виде строки.

Есть ли способ достичь этого?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Взгляните на эту страницу в документации Свойства и типы значений , особенно бит с именем Встроенная сущность , который позволит вам сохранить сущность JSON, а затем запросить его подвойства пока он индексируется.

0 голосов
/ 14 января 2019

Я полагаю, что проблема упрощается, если принять во внимание, что вам не нужно использовать ключ сущности 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();
};

Обратите внимание, что при этом не будет сохранен тип значений для каждого ключа (все они будут Strings). Это не проблема, если вам не нужен тип (то есть Int, String ...) для каждого значения, которое будет использоваться позже.

Однако это, кажется, самое простое решение, и оно выполняет всю работу по созданию каждого свойства с каждым значением .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...