MongoDB: получать документы по тегам - PullRequest
10 голосов
/ 04 августа 2011

У меня есть документы, содержащие массив tags. Я хочу предоставить рекомендации на основе тегов на сайте, поэтому мне нужно получить документы, содержащие те же теги + документы, которые не соответствуют 1 тегу + документы, которые не соответствуют 2 тегам и т. Д. *

Как мне это сделать?

Ответы [ 3 ]

17 голосов
/ 04 августа 2011

пример коллекции:

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"] } } ] })
1 голос
/ 10 января 2015

Перефразированный вопрос:

Предположим, если к объявлениям о вакансиях прикреплены поисковые теги, например

Объявления о вакансиях

[{_id : ObjectId(1249999493),tags : ['Location1', 'SkillSet1', 'SkillSet2', 'Someother1', 'Someother2']},
 {_id : ObjectId(1249999494),tags : ['Location3', 'SkillSet1', 'SkillSet0', 'Someother4', 'Someother3']}]

Теперь ему нужны записи, имеющие теги ['Location1', 'SkillSet1', 'SkillSet0']

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

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

0 голосов
/ 20 ноября 2014

Шаги:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...