Myślę, że używając Apache Solr lub ElasticSearch zyskujesz większą elastyczność i wydajność, ale jest to obsługiwane za pomocą Aggregation Framework.
Głównym problemem przy użyciu MongoDB jest zapytanie N razy: najpierw dla uzyskania pasujących wyników, a następnie raz dla każdej grupy; podczas korzystania z wyszukiwarki pełnotekstowej dostajesz wszystko w jednym zapytaniu.
Przykład
//'tags' filter simulates the search
//this query gets the products
db.products.find({tags: {$all: ["tag1", "tag2"]}})
//this query gets the size facet
db.products.aggregate(
{$match: {tags: {$all: ["tag1", "tag2"]}}},
{$group: {_id: "$size"}, count: {$sum:1}},
{$sort: {count:-1}}
)
//this query gets the color facet
db.products.aggregate(
{$match: {tags: {$all: ["tag1", "tag2"]}}},
{$group: {_id: "$color"}, count: {$sum:1}},
{$sort: {count:-1}}
)
//this query gets the brand facet
db.products.aggregate(
{$match: {tags: {$all: ["tag1", "tag2"]}}},
{$group: {_id: "$brand"}, count: {$sum:1}},
{$sort: {count:-1}}
)
Gdy użytkownik filtruje wyszukiwanie za pomocą aspekty, trzeba dodać ten filtr kwerendy orzecznik i mecz orzecznik następująco.
//user clicks on "Brand 1" facet
db.products.find({tags: {$all: ["tag1", "tag2"]}, brand: "Brand 1"})
db.products.aggregate(
{$match: {tags: {$all: ["tag1", "tag2"]}}, brand: "Brand 1"},
{$group: {_id: "$size"}, count: {$sum:1}},
{$sort: {count:-1}}
)
db.products.aggregate(
{$match: {tags: {$all: ["tag1", "tag2"]}}, brand: "Brand 1"},
{$group: {_id: "$color"}, count: {$sum:1}},
{$sort: {count:-1}}
)
db.products.aggregate(
{$match: {tags: {$all: ["tag1", "tag2"]}}, brand: "Brand 1"},
{$group: {_id: "$brand"}, count: {$sum:1}},
{$sort: {count:-1}}
)
Aggregation Framework wydaje się obiecujące. Nie widzę problemu z wykonywaniem dodatkowych zapytań na grupę aspektów. Pozwól mi utworzyć aplikację POC do sprawdzenia poprawności tej implementacji. –
Tak, jest naprawdę potężny i daje nam wiele możliwości. Głównym problemem w tej strukturze jest optymalizacja zapytań. Używanie shardingu oznacza brak optymalizacji zapytań. Pracuję nad naprawianiem tych problemów i wciąganiem ich w github. –