Невозможно получить элементы вложенного документа в mongodb c #

1

Структура модели:

//Main doc model
Public class MainDocumentModel
{
   [BsonId]
   [BsonRepresentation(BsonType.ObjectId)]
   public string Id { get; set; }

   public string Name{ get; set; }
   public List<SubDocuementModel> SubDocsList { get; set; }
}

//sub doc model
Public class SubDocumentModel
{
   public string Id { get; set; }

   [BsonIgnoreIfNull]
   public string MainDocId { get; set; }
   public string Name{ get; set; }

   [BsonIgnoreIfNull]
   public List<SubDocuementModel> SubDocsList { get; set; } 
   .
   .
   .
}

В БД, когда я вставляю MainDocuement, его структура выглядит так:

{
    "_id" : ObjectId("54b9d732bb63bc10ec9bad6f"),
    "Name" : "Name-1",
    "SubDocsList  : [{
        "Id" : "54b9e76dbb63bc1890e8761b",
        "Name" : "Sub-Name-1"
    },....]
}

Теперь я хочу получить поддокументы, где main doc Id == 54b9d732bb63bc10ec9bad6f:

private void getSubDoc(SubDocumentModel oModel)
{
  _MainDoc = _db.GetCollection<MainDocumentModel>("MainDoc");
  _query =  Query<MainDocumentModel>.Where(e => e.Id == oModel.MainDocId);

  //Here I get the exception
  //Exception: An error occurred while deserializing the SubDocsList property
  of class Data.MainDocumentModel: Element 'Id' does not match any field or
  property of class Data.SubDocumentModel.
  private MainDocumentModel _mainDocModel = _MainDoc.FindOneAs<MainDocumentModel>(_query);

 oModel.SubDocsList =
                        _mainDocModel .SubDocsList .FindAll(
                            x => x.Name.ToLower().Contains("NameFilter"));

 //Pagination 
 oModel.SubDocsList =
                        oModel.SubDocsList .Take(oModel.ItemsPerPage)
                            .Skip(oModel.ItemsPerPage*(oModel.PageNo - 1))
                            .ToList();
}
  1. Почему я получаю исключение от десериализации. Что я делаю неправильно?

  2. Здесь я применяю логику разбиения на страницы в список С#. Как я могу применить разбиение на страницы в запросе манго?

Очень просто применить разбивку на страницы для основного документа как:

mainDocCursor = MainDoc .Find(_query).SetSortOrder(SortBy.Ascending("Name")).SetLimit(oModel.ItemsPerPage).SetSkip(oModel.ItemsPerPage * (oModel.PageNo - 1));

Как я могу достичь такой же разбивки на страницы для поддокументов?

Теги:
asp.net-mvc
mongodb-.net-driver
pagination

1 ответ

0
Лучший ответ

Я решил исключение десериализации, со следующими небольшими изменениями:

В SubDocumentModel:

Public class SubDocumentModel
{
   [BsonId]
   [BsonRepresentation(BsonType.ObjectId)]
   public string Id { get; set; }
   .
   .
   .
}

И когда я вставляю поддокумент, я сохраняю Id как идентификатор объекта не как строку (ранее я сохранял его как строку, которая вызывала проблему):

public void addSubDocument(SubDocumentModeloModel)
{
    _MainDoc = _db.GetCollection<MainDocumentModel>("MainDoc");
    BsonDocument subDocument = new BsonDocument
    {
       {"_id", ObjectId.GenerateNewId()},//Previously it was {"Id", ObjectId.GenerateNewId().ToString()}
       {"Type", oModel.Name}
    };

    _query = Query<MainDocumentModel>.Where(e => e.Id == oModel.MainDocId);
    _updateBuilder = Update.Push("SubDocsList", subDocument);
    _MainDoc.Update(_query, _updateBuilder);
}

Однако я все еще не нашел способ разбиения на страницы поддокумента в mongodb-С#

Ещё вопросы

Сообщество Overcoder
Наверх
Меню