Учитывая следующую коллекцию документов 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
- запросить элементы путем "ИЛИ" вместе с тегами
- т.е. где («рубашка» IN items.tags) ИЛИ («рубашка» IN items.tags)
- это вернет, например, три экземпляра "Shirt One", 2 экземпляра "Shirt Three" и т. Д.
- отобразить / уменьшить этот вывод
- map: emit (this._id, {...});
- уменьшить: подсчитать общее количество вхождений _id
- Завершение: сортировка по подсчитанному итогу
Но мне не ясно, как реализовать это как запрос Монго, или если это даже самый эффективный подход.