2015-12-01 3 views
2
using MongoDB.Bson; 
using MongoDB.Driver; 

protected static IMongoClient client; 
protected static IMongoDatabase db; 

     public async void Insert() 
     { 
     client = new MongoClient(); 
     db = client.GetDatabase("Database"); 

     string json = "["; 

     foreach (CsvObjects.Connections e in connectionsList) 
     { 
      json += "{"; 
      json += "\"DateTime\":\"" + e.DateTime + "\","; 
      json += "\"Value\":\"" + e.Value + "\","; 
      json += "},"; 
     } 

     json += "]"; 

     MongoDB.Bson.BsonDocument document = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(json); 

     var collection = db.GetCollection<BsonDocument>("data"); 
     await collection.InsertOneAsync(document); 

Я сделал ArrayList с данными, которые я хочу, чтобы вставить в MongoDB, я попытался сделать JSON и вставить его с помощью метода InsertOneAsync, но я получил ошибку десериализации. Там может быть более простой способ сделать это, но я понятия не имею, как это сделать.вставки данных в MongoDB используя C#

Я пробовал некоторые потоки stackoverflow по этой теме, но безрезультатно.

«Не может десериализации„BsonDocument“из BsonType„Массив“»

+0

Спасибо вам за помощь. Теперь работает. Прямо сейчас у меня только одна проблема, для обработки всех объектов милхона требуется более 30 минут. Я пытаюсь использовать многопозиционный метод Async. Но я не знаю, как вставить арреалиста. var FoodCollection = _db.GetCollection ("Foods"); foreach (CsvObjects.Food e in foodList) { Ожидать FoodCollection.InsertOneAsync (e.ToBsonDocument()); } Console.WriteLine («проделанная вставка пищевых документов»); – Filidor

ответ

0

Из сообщения об ошибке, вы пытаетесь десериализации и массив JSON документов в единый документ.

Вместо этого вы можете выполнить Deserialize и InsertOneAsync внутри вашего цикла foreach или создать еще один цикл, который вставляет один документ за раз.

Также используйте класс StringBuilder! строка неизменна, поэтому для каждого элемента в connectionList ваш текущий код создает 2n + 2 строки!

1

Возможно, вам даже не придется создавать строку JSON, кроме того, что она многословна, она подвержена ошибкам. Например, вы можете использовать расширение ToBsonDocument, например, в MongoDB.Bson.

using MongoDB.Bson; 
using MongoDB.Driver; 
using System; 
using System.Collections.Generic; 
using System.Threading.Tasks; 

namespace Example 
{ 
    class FooItem 
    { 
     public DateTime DateTime { get; set; } 
     public string Value { get; set; } 
    } 

    class InsertTest 
    { 
     protected static IMongoClient _client; 
     protected static IMongoDatabase _db; 

     static void Main(string[] args) 
     { 
      _client = new MongoClient(); 
      _db = _client.GetDatabase("Database"); 
      MainAsync(args).GetAwaiter().GetResult(); 
     } 

     static IEnumerable<FooItem> GetList() 
     { 
      yield return new FooItem 
      { 
       DateTime = DateTime.Now, 
       Value = "I am foo 1" 
      }; 
      yield return new FooItem 
      { 
       DateTime = DateTime.Now, 
       Value = "I am foo 2" 
      }; 
     } 

     static async Task MainAsync(string[] args) 
     { 
      var collection = _db.GetCollection<BsonDocument>("data"); 
      foreach (var item in GetList()) 
      { 
       await collection.InsertOneAsync(item.ToBsonDocument()); 
      } 
     } 
    } 
} 

Это дает этот результат

{ "_id" : ObjectId("565e70208af88628ecb3237d"), "DateTime" : ISODate("2015-12-02T04:14:24.789Z"), "Value" : "I am foo 1" } 
{ "_id" : ObjectId("565e70228af88628ecb3237e"), "DateTime" : ISODate("2015-12-02T04:14:26.511Z"), "Value" : "I am foo 2" } 
-1

ждут collection.InsertOneAsync (item.ToBsonDocument());

«ожидание» - это ключевое слово, если нет, где оно инициализируется

+0

Что вы имеете в виду? – Hexfire

Смежные вопросы