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']

И выбранные документы, имеющие больше ключевых слов из запроса, должны стоять на первом месте. Меньше соответствия ключевых слов должно быть последним. Таким образом, можно найти более подходящую вакансию для поискового запроса.

Я разумный или мне нужно перефразировать?

Шаги:

  1. Найдите подходящие товары, которые содержат любой из указанных ключей.

  2. Развернуть на ключи

  3. Найти снова, чтобы отфильтровать нежелательные после разворачивания

  4. Сгруппируйте их, добавив ключевые вхождения

  5. Сортировать 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}]

Другие вопросы по тегам