replicated - MongoDB: obtener documentos por etiquetas
replicated to allow failover in mongodb (3)
Tengo documentos que contienen tags
array. Deseo proporcionar recomendaciones basadas en etiquetas en el sitio, por lo que necesito obtener documentos que contengan las mismas etiquetas + documentos que no coincidan con 1 etiqueta + documentos que no coincidan con 2 etiquetas, etc.
¿Cómo puedo hacer eso?
colección de ejemplo:
db.tags.insert({"tags":["red", "tall", "cheap"]});
db.tags.insert({"tags":["blue", "tall", "expensive"]});
db.tags.insert({"tags":["blue", "little", "cheap"]});
buscar todos etiquetados "azul"
db.tags.find({tags: "blue"})
encontrar todos etiquetados "azul" y "barato"
db.tags.find({ tags: { $all: ["cheap", "blue"] } } )
encontrar todo no "azul"
db.tags.find({tags: { $ne: "blue" } })
encontrar todo "azul" y "barato" pero no "rojo" y no "alto"
no es posible en mi mongo db. Desde mongodb 1.9.1 en algo así debería funcionar, aunque (no probado):
db.tags.find({ $and: [ {tags: { $all: ["blue", "cheap"] } }, { tags: { $nin: ["red", "tall"] } } ] })
Pasos:
Encuentra productos coincidentes que contengan cualquiera de las claves especificadas.
Despliegue en las teclas
Encuentra de nuevo para filtrar no deseado después de desplegarse
Agruparlos agregando la aparición de la clave
Ordenar desc para obtener más relevante primero
[{"$ 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}]
La pregunta reformulada es:
Supongamos que si las publicaciones de trabajo tienen etiquetas de búsqueda adjuntas como
Ofertas de trabajo
[{_id : ObjectId(1249999493),tags : [''Location1'', ''SkillSet1'', ''SkillSet2'', ''Someother1'', ''Someother2'']},
{_id : ObjectId(1249999494),tags : [''Location3'', ''SkillSet1'', ''SkillSet0'', ''Someother4'', ''Someother3'']}]
Ahora, él quiere que los registros tengan etiquetas [''Location1'', ''SkillSet1'', ''SkillSet0'']
Y los documentos seleccionados que tengan más palabras clave de la consulta deberían ser lo primero. Menos palabras clave que coincidan deben ser las últimas. Entonces, uno puede obtener una publicación de trabajo más adecuada para la consulta de búsqueda.
¿Soy sensato o necesito volver a formular?