Как бы вы сохранили сложную вложенную структуру данных JSON в MongoDB, используя клиентский драйвер MongoDB C #? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть сложная вложенная структура данных JSON ниже, сохраненная в файле data.json.Структура данных сокращена, но это будет применяться ко всем структурам данных json.Я прочитал и десериализовать JSON в C # модель.Затем я записываю объект / данные в MongoDB, используя клиентский драйвер MongoDB C #. Как сохранить этот комплексный объект / данные / модель в MongoDB?

Сложная вложенная структура данных, файл data.json

    [
      {
        "property_1": "value_1",
        "property_2": "value_2",
        "property_3": {
          "_some_property_1": 1,
          "_some_property_2": "some_value_2",
          "some_property_3": "some_value_3",
          "some_property_4": "some_value_4"
        },
        "property_4": "value_4",
        "property_5": "value_5",
        "iproperty_6": "Nvalue_6",
        "property_7": "value_7",
        "property_8": "value_8",
        "property_9": "value_9"
      }
    ]

C # ASP.NET Web Api Демонстрационный код

    namespace DemoWebApi.Controllers
    {
        public class ValuesController : ApiController
        {
            // GET api/values
            public void Get()
            {
                var models = CreateModels();

                var client = new MongoClient("mongodb://localhost:27017/admin");
                var database = client.GetDatabase("TestDB");
                /*
                THIS DOES NOT WORK
                    IMongoCollection<MODEL> collection = database?.GetCollection<MODEL>("TestCollection");            
                    collection.InsertMany(models);
               */
            }

            private static List<Model> CreateModels()
            {
                List<Model> models = new List<Model>();
                foreach (string file in Directory.GetFiles("<path/to/data.json>", "*", SearchOption.AllDirectories))
                {
                    using (var fileStream = File.OpenRead(file))
                    {
                        using (var sr = new StreamReader(fileStream))
                        {
                            string json = sr.ReadToEnd();

                            var data = JsonConvert.DeserializeObject<List<Model>>(json);
                            models.AddRange(data);
                        }
                    }
                }

                return models;
            }
        }
    }

C # Модель

    namespace DemoWebApi.Models
    {
        public class Model
        {

            [BsonExtraElements, BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments), JsonExtensionData]
            public IDictionary<string, object> _additionalData;
        }
    }

1 Ответ

0 голосов
/ 14 декабря 2018

С помощью товарищей по команде это работает.Сериализуйте вашу модель на BsonDocument и передайте BsonDocument в метод вставки драйвера MongoDB C #.Таким образом, вы можете работать с вашим объектом C # POCO до тех пор, пока вы не захотите сохранить его в MongoDB, а затем сериализовать в массив BsonDocument или BsonDocument и сохранить его.Для этой сложной модели BsonDocument[] решает мою проблему

Сохраните сложную модель json с этой формой и структурой, более сложной, чем эта форма и структура ниже, в MongoDB

//Complex json collection/array shape and structure to save as is in MongoDB

    [
      {
        "property_1": "value_1",
        "property_2": "value_2",
        "property_3": {
          "_some_property_1": 1,
          "_some_property_2": "some_value_2",
          "some_property_3": "some_value_3",
          "some_property_4": "some_value_4"
        },
        "property_4": "value_4",
        "property_5": "value_5",
        "iproperty_6": "Nvalue_6",
        "property_7": "value_7",
        "property_8": "value_8",
        "property_9": "value_9"
      }
    ]





// This works - code snippets
 /*Create a collection of C# POCO from for the json.
 // My assumption is you can create C# objects/collections from complex json shape and structure
 //   Serialize to MongoDB BsonDocument and save*/

        var models = new List<Model>{ new Model()}; // Create C# collection from json
        string text = JsonConvert.SerializeObject(models);
        var bsonDocument = BsonSerializer.Deserialize<BsonDocument[]>(text);
        var client = new MongoClient("mongodb://localhost:27017/admin");
        var database = client.GetDatabase("TestDB");
        IMongoCollection<BsonDocument> collection = database?.GetCollection<BsonDocument>("TestCollection");
        collection.InsertMany(bsonDocument);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...