使用C#将数据插入Mongodb

时间:2015-12-01 23:32:42

标签: c# json mongodb bson

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);

我创建了一个arylylist,其中包含我要插入mongodb的数据,我尝试使用insertOneAsync方法生成一个json并插入它,但是我得到了反序列化错误。可能有一种更简单的方法可以做到这一点,但我不知道如何。

我尝试了一些关于这个主题的其他stackoverflow线程,但没有用。

  

&#34;无法反序列化&#39; BsonDocument&#39;来自BsonType&#39; Array&#39;&#34;

3 个答案:

答案 0 :(得分:1)

您可能甚至不必创建JSON字符串,除了它很容易出错。例如,您可以使用MongoDB.Bson中的ToBsonDocument扩展名。

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 :(得分:0)

从错误消息中,您尝试将JSON文档的反序列化和数组放入单个文档中。

相反,要么在foreach循环中执行Deserialize和InsertOneAsync,要么创建另一个循环,一次插入1个文档。

另外,使用StringBuilder类! string是不可变的,因此对于connectionsList中的每个项目,您当前的代码正在创建2n + 2个字符串!

答案 2 :(得分:-1)

await collection.InsertOneAsync(item.ToBsonDocument());

&#34;等待&#34;是关键字,如果不是初始化的地方