Учитывая следующую коллекцию документов MongoDB:
{
title : 'shirt one'
tags : [
'shirt',
'cotton',
't-shirt',
'black'
]
},
{
title : 'shirt two'
tags : [
'shirt',
'white',
'button down collar'
]
},
{
title : 'shirt three'
tags : [
'shirt',
'cotton',
'red'
]
},
...
Как получить список элементов, соответствующих списку тегов, упорядоченных по общему количеству совпадающих тегов? Например, учитывая этот список тегов в качестве входных данных:
['shirt', 'cotton', 'black']
Я хотел бы получить элементы, ранжированные в порядке описания по общему количеству совпадающих тегов:
item total matches
-------- --------------
Shirt One 3 (matched shirt + cotton + black)
Shirt Three 2 (matched shirt + cotton)
Shirt Two 1 (matched shirt)
В реляционной схеме теги были бы отдельной таблицей, и вы могли бы объединиться с этой таблицей, подсчитать совпадения и упорядочить по количеству.
Но в Монго...?
Кажется, этот подход может сработать,
- разбить входные теги на несколько операторов «IN»
- query for items by "OR"'ing together the tag inputs
- i.e. where ( 'shirt' IN items.tags ) OR ( 'cotton' IN items.tags )
- это вернет, например, три экземпляра «Рубашка один», 2 экземпляра «Рубашка три» и т. д.
- map/reduce that output
- map: emit(this._id, {...});
- уменьшить: подсчитать общее количество вхождений _id
- finalize: сортировать по подсчитанному итогу
Но я не понимаю, как реализовать это как запрос Mongo, или это даже самый эффективный подход.