Получение данных из mongodb с помощью драйвера C#

Я использую официальный драйвер mongodb для c# в своем тестовом проекте, и я уже вставил документ из веб-приложения c# в mongodb. В консоли mongo, db.блог.find () может отображать вставленные мной записи. но когда я попытался их получить, .net бросил исключение

система".InvalidOperationException: ReadString может вызываться только тогда, когда CurrentBsonType является строкой, а не когда CurrentBsonType является ObjectId."

мой класс сущностей очень просто

namespace MongoDBTest
{
    public class Blog
    {
        public String _id
        {
            get;
            set;
        }

        public String Title
        {
            get;
            set;
        }
    }
}

и это мой код извлечения

public List<Blog> List()
{
    MongoCollection collection = md.GetCollection<Blog>("blog");
    MongoCursor<Blog> cursor = collection.FindAllAs<Blog>();
    cursor.SetLimit(5);
    return cursor.ToList();
}

может кто-нибудь помочь мне? спасибо!

4 ответов


Я полагаю, вам просто нужно отметить свой идентификатор блога с BsonId (и вставьте id самостоятельно) атрибут:

public class Blog
{
    [BsonId]
    public String Id {get;set;}

    public String Title{get;set;}
}

и все должно быть нормально. Проблема была в том, что вы не отметили, какое поле будет Mongodb _id и драйвер генерируется _id поле с типом ObjectId. И когда драйвер пытается десериализовать его обратно, он не может преобразовать ObjectId в строку.

пример:

MongoCollection collection = md.GetCollection<Blog>("blog");
var blog = new Blog(){Id = ObjectId.GenerateNewId().ToString(), 
                      Title = "First Blog"};
collection .Insert(blog);

MongoCursor<Blog> cursor = collection.FindAllAs<Blog>();
cursor.SetLimit(5);

var list = cursor.ToList();

извлечение данных из MongoDB с помощью C# довольно просто, и есть три разных способа, которыми данные могут быть развернуты для frontend

  1. список
  2. курсор
  3. linq

    using (var cursor = await col.Find(new BsonDocument()).ToCursorAsync())
    {
     while (await cursor.MoveNextAsync())
     {
        foreach (var doc in cursor.Current)
        {
            Console.WriteLine(doc);
        }
      }
    }
    

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


взгляните на мой пример проекта в github. Поздно, я действительно заинтересовался MongoDB. Это приложение показывает много полезных вещей, которые могут вас заинтересовать; шаблон репозитория с MongoDB.


тип и имя члена id должны отличаться следующим образом

public ObjectId Id { get; set; }

здесь ObjectId в пространстве имен MongoDB.Bson