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

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

"System.InvalidOperationException: ReadString может вызываться, только если CurrentBsonType имеет значение String, но не когда 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();
}

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


person Ken Qiu    schedule 21.07.2011    source источник


Ответы (4)


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

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

    public String Title{get;set;}
}

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

Полный пример:

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();
person Andrew Orsich    schedule 21.07.2011
comment
привет, Эндрю Орсич, я вставил документ с помощью BsonDocument, и mongodb автоматически сгенерировал ObjectId для документа и сохранил его, когда я использую MongoCollection‹Blog› и вызываю метод FindAllAs‹Blog›, метод ReadString выдает исключение. Поэтому я заменяю MongoCollection‹Blog› на MongoCollection‹BsonDocument› и обхожу объект курсора в операторе foreach, чтобы преобразовать каждый документ в объект блога. В любом случае, ваш ответ помог мне решить мою проблему, спасибо :) - person Ken Qiu; 21.07.2011
comment
Более простым решением было бы изменить тип данных вашего идентификатора на ObjectId и украсить его [BsonId]. Я столкнулся с тем же сообщением об ошибке, и внесение этого изменения исправило его для меня. - person CodeMonkey1313; 29.09.2011

Извлечение данных из MongoDB с помощью C# довольно просто, и есть три различных способа развертывания данных для внешнего интерфейса.

  1. Список
  2. Курсор
  3. ссылка

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

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

person sujith    schedule 16.07.2015

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

person Amit Kr    schedule 10.02.2014

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

public ObjectId Id { get; set; }

Где ObjectId находится в пространстве имен MongoDB.Bson

person Yossi Lev    schedule 15.06.2014