2013-12-16 3 views
0

Предположим, я хочу смоделировать мой домен, используя составной шаблон. Модель (gist) довольно проста. На контроллере альбома я хочу, чтобы выполнить поиск по заданному имени:Композитный рисунок абстракции. Упорство. Запрос иерархических данных

public ActionResult Edit(String name) { 
    if(name == null) { 
     ViewBag.ViewRoot = true; 
     return View(this.albums.All()); 
    } 

    var album = this.albums.Single(a => a.Name == name); 
    if(album != null) { 
     ViewBag.ViewRoot = false; 
     return View(album.Yield()); 
    } 

    return View("404", (Object)("Album:" + name)); 
} 

Полученных (фильтруется) сохранялся объект выглядит следующим образом:

{ 
    "_id" : "52ab1a6a7b88c91e5cfc39ff", 
    "ParentId" : null, 
    "Name" : "sample01", 
    "Items" : [{ 
     "_t" : "Album", 
     "_id" : null, 
     "ParentId" : "52ab1a6a7b88c91e5cfc39ff", 
     "Name" : "sample02", 
     "Items" : [{ 
      "_t" : "Album", 
      "_id" : null, 
      "ParentId" : null, 
      "Name" : "sample03", 
      "Items" : [] 
     }] 
    }] 
} 

MongoDB не выполняет рекурсивный поиск из коробки , Но он позволяет выполнять запросы при условии, что вы предоставите явный direction (пример кода взят из MongoDB + C# driver + query array of elements where each array element contains sub-document to query on):

Query.ElemMatch("Children", Query.And(Query.EQ("StatusId", 1), Query.EQ("Active", true),Query.LT("SubChild.ExpiresOn", DateTime.UtcNow))); 

Я думал о два решения (которые могли бы держать его composite):

  • отслеживание глубины узла (тогда я должен построить сложный запрос);
  • использовать знак родителя (id, name), извлечь весь граф, а затем выполнить рекурсивный поиск на стороне клиента.

Что вы думаете об этом?

+0

Вы пытаетесь смоделировать иерархию деревьев? @brick –

+0

@sleimanjneidi да. – lexeme

ответ

1

Есть некоторые шаблоны проектирования для моделирования древовидных структур в mongodb среди которых:

  • Родитель Ссылки
  • Ребенок Ссылки
  • Массив Предков
  • Материализованные Дорожки
  • Вложенные наборы

для меня звучит так, как будто вам нужна древовидная структура с материализованными дорожками, но вы можете взглянуть на MongoDB documentation для получения дополнительной информации о доступных шаблонах проектирования, используемых для подобных вопросов.

+0

Если я правильно понимаю, мысль, связанная с использованием материализованного пути, заключается в том, что вы присоединяете массив идентификаторов существующих сущностей. Это правильно? Затем он вскрывает идею сложного шаблона. – lexeme

+0

@brick материализованный путь заключается в том, что вы указываете путь документа в поле пути. Я не говорю о составном шаблоне здесь, я просто предложил вам эффективно сохранить вашу древовидную структуру, поэтому вам не нужно выполнять рекурсивные запросы –

+0

Да, я понять это. И я думал о «МП». Но я сосредоточен на шаблоне. Разве это не хорошо, когда дело касается упорства? Итак, вы должны использовать методы, упомянутые выше? – lexeme

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