Предположим, я хочу смоделировать мой домен, используя составной шаблон. Модель (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), извлечь весь граф, а затем выполнить рекурсивный поиск на стороне клиента.
Что вы думаете об этом?
Вы пытаетесь смоделировать иерархию деревьев? @brick –
@sleimanjneidi да. – lexeme