MongoDB: получать документы по тегам
У меня есть документы, содержащие tags
массив. Я хочу предоставить рекомендации на основе тегов на сайте, поэтому мне нужно получить документы, содержащие те же теги + документы, которые не соответствуют 1 тегу + документы, которые не соответствуют 2 тегам и т. Д.
Как я могу это сделать?
3 ответа
Пример коллекции:
db.tags.insert({"tags":["red", "tall", "cheap"]});
db.tags.insert({"tags":["blue", "tall", "expensive"]});
db.tags.insert({"tags":["blue", "little", "cheap"]});
найти все, что включает в себя тег "синий"
db.tags.find({tags: { $elemMatch: { $eq: "blue" } }})
найти все с меткой "синий" и только синий
db.tags.find({tags: "blue"})
найти все теги "синий" и "дешевый"
db.tags.find({ tags: { $all: ["cheap", "blue"] } } )
найти все не "синий"
db.tags.find({tags: { $ne: "blue" } })
найти все "синие" и "дешевые", но не "красные" и не "высокие"
не возможно в моем монго дб. Из mongodb 1.9.1 на что-то подобное должно работать, хотя (не проверено):
db.tags.find({ $and: [ {tags: { $all: ["blue", "cheap"] } }, { tags: { $nin: ["red", "tall"] } } ] })
Перефразированный вопрос:
Предположим, что к объявлениям о вакансиях прикреплены поисковые теги, например
Объявления о работе
[{_id : ObjectId(1249999493),tags : ['Location1', 'SkillSet1', 'SkillSet2', 'Someother1', 'Someother2']},
{_id : ObjectId(1249999494),tags : ['Location3', 'SkillSet1', 'SkillSet0', 'Someother4', 'Someother3']}]
Теперь он хочет, чтобы записи имели теги ['Location1', 'SkillSet1', 'SkillSet0']
И выбранные документы, имеющие больше ключевых слов из запроса, должны стоять на первом месте. Меньше соответствия ключевых слов должно быть последним. Таким образом, можно найти более подходящую вакансию для поискового запроса.
Я разумный или мне нужно перефразировать?
Шаги:
Найдите подходящие товары, которые содержат любой из указанных ключей.
Развернуть на ключи
Найти снова, чтобы отфильтровать нежелательные после разворачивания
Сгруппируйте их, добавив ключевые вхождения
Сортировать desc, чтобы получить наиболее релевантные в первую очередь
[{ "$match": { "keys": { "$in": [ { "$regex": "text", "$options": "i"}]}}}, { "$unwind": "$keys"}, { "$match": { "keys": { "$in": [ { "$regex": "text", "$options": "i"}]}}}, { "$group": { "_id": { "productId": "$productId"}, "relatedTags": { "$sum": 1} }}, { "$sort": { "relatedTags": -1}},{ "$limit": 10}]