System.FormatException при попытке десериализации BsonDocument в классе - PullRequest
0 голосов
/ 18 декабря 2018

Я совершенно новичок в mongoDB и изучаю основы.Я использую драйвер .NET (2.7.2) mongoDB и Robo 3T в качестве служебной программы для управления базами данных вручную.Я создал TestDB базу данных, в которой создал myCollection, где у меня есть много тестовых документов, таких как:

/* 1 */
{
    "_id" : ObjectId("5c124ee01c2477487574b212"),
    "x" : 1.0
}

/* 2 */
{
    "_id" : ObjectId("5c17d26369babb0c04610a33"),
    "count" : 1
}

/* 3 */
{
    "_id" : ObjectId("5c17d40f6002a11c44bc2c42"),
    "name" : "MongoDB",
    "type" : "Database",
    "count" : 1,
    "info" : {
        "x" : 203,
        "y" : 102
    }
}

/* 4 */
{
    "_id" : ObjectId("5c17dead9e83de138c71278a"),
    "counter" : 0
}

/* 5 */
{
    "_id" : ObjectId("5c17dead9e83de138c71278b"),
    "counter" : 1
}

/* 6 */
{
    "_id" : ObjectId("5c17dead9e83de138c71278c"),
    "counter" : 2
}

/* 7 */
{
    "_id" : ObjectId("5c17dead9e83de138c71278d"),
    "counter" : 3
}

/* 8 */
{
    "_id" : ObjectId("5c17dead9e83de138c71278e"),
    "counter" : 4
}

/* 9 */
{
    "_id" : ObjectId("5c17dead9e83de138c71278f"),
    "counter" : 5
}

/* 10 */
{
    "_id" : ObjectId("5c17dead9e83de138c712790"),
    "counter" : 6
}

/* 11 */
{
    "_id" : ObjectId("5c17dead9e83de138c712791"),
    "counter" : 7
}

/* 12 */
{
    "_id" : ObjectId("5c17dead9e83de138c712792"),
    "counter" : 8
}

/* 13 */
{
    "_id" : ObjectId("5c17dead9e83de138c712793"),
    "counter" : 9
}

/* 14 */
{
    "_id" : ObjectId("5c17dead9e83de138c712794"),
    "counter" : 10
}

и т. Д. ... В моем консольном приложении (в сообществе Visual Studio 2017)Я создал два класса, как это:

public class MyClass
{
    [BsonId]
    public ObjectId ID { get; set; }
    public string name { get; set; }
    public string type { get; set; }
    public int count { get; set; }
    public List<Info> info { get; set; }
}

public class Info
{
    public int x { get; set; }
    public int y { get; set; }
}

Я хотел бы получить документ из базы данных, который помечен как /* 3 */ в моих данных примера, который является более сложным.Программа, в которой я пытаюсь получить данные в основном методе, выглядит следующим образом:

    static void Main(string[] args)
    {
        var client = new MongoClient();
        var database = client.GetDatabase("TestDB");
        var collection2 = database.GetCollection<MyClass>("myCollection");


        var o = collection2.Find(i => i.name == "MongoDB").SingleOrDefault();

        Console.ReadLine();
    }

Когда я запускаю приложение, я получаю эту ошибку: System.FormatException:"An error occurred while deserializing the info property of class TEST_MongoDB_consoleApp.MyClass: Cannot deserialize a 'List<Info>' from BsonType 'Document'."

Что я делаю не так?

Я также создал этот класс (для менее сложных документов в myCollection):

public class TestModel
{
    [BsonId]
    public ObjectId IDTestmodel { get; set; }
    public int counter { get; set; }
}

, и я могу десериализовать его и получить его из базы данных без каких-либо проблем при выполнении этого жеспособ с MyClass, который выглядит следующим образом:

    static void Main(string[] args)
    {
        var client = new MongoClient();
        var database = client.GetDatabase("Test");
        var collection = database.GetCollection<TestModel>("myCollection");

        var o = collection.Find(i => i.counter == 5).SingleOrDefault(); 

        Console.WriteLine(o.IDTestmodel);

        Console.ReadLine();
    }

В этом случае программа работает без каких-либо исключений, и я получаю правильное значение ObjectID из документа.

Снова - что я делаю неправильнов случае MyClass?

1 Ответ

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

Это поможет.В Mongodb для каждой записи в коллекции должен быть объект, за которым следуют поля.

Необходимо изменить класс информации следующим образом:

public class Info
{
    [BsonId]
    public ObjectId Id {get; set; }
    public int x { get; set; }
    public int y { get; set; }
}
...