2015-01-17 2 views
1

Модель структуры:Невозможно получить элементы поддокумент MongoDB с #

//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. Почему я получаю выше deserializing исключение. Что я делаю неправильно?

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

Это очень легко применить нумерацию страниц для основного документа как:

mainDocCursor = MainDoc .Find(_query).SetSortOrder(SortBy.Ascending("Name")).SetLimit(oModel.ItemsPerPage).SetSkip(oModel.ItemsPerPage * (oModel.PageNo - 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); 
} 

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

Смежные вопросы