2011-08-04 19 views
9

Tengo documentos que contienen tags matriz. 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 ...MongoDB: obtener documentos por etiquetas

¿Cómo hago? ¿ese?

+1

Dado lo que ha dicho a continuación, esta pregunta no está clara.Tal vez un ejemplo del resultado deseado ayudaría a –

Respuesta

12

ejemplo colección:

db.tags.insert({"tags":["red", "tall", "cheap"]}); 
db.tags.insert({"tags":["blue", "tall", "expensive"]}); 
db.tags.insert({"tags":["blue", "little", "cheap"]}); 

encuentra toda etiquetado como "azul"

db.tags.find({tags: "blue"}) 

encontrar toda etiquetado como "azul" y "barato"

db.tags.find({ tags: { $all: ["cheap", "blue"] } }) 

encuentran no todo "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. De mongodb 1.9.1 en algo como esto debería funcionar, aunque (no probado):

db.tags.find({ $and: [ {tags: { $all: ["blue", "cheap"] } }, { tags: { $nin: ["red", "tall"] } } ] }) 
+2

. No entendiste la idea. No necesito una coincidencia exacta. Quiero todos los documentos que contengan al menos una de las etiquetas ordenadas por el recuento de las etiquetas originales que incluye. – Daniel

+1

¿te gustaría formular la pregunta con más precisión? – rompetroll

+0

pensé que lo hice :( – Daniel

0

pasos:

  1. encontrará productos a juego que contiene cualquiera de las claves especificadas.

  2. Despliegue en las teclas

  3. sí encontramos de nuevo para filtrar no deseado después de haber desplegado

  4. Grupo mediante la adición de ocurrencia clave

  5. Ordenar desc para obtener más relevante primero

[{"$ match": {"keys": {"$ in": [{"$ regex": "text", "$ options": "i"}]}}}, {"$ un wind ":" $ keys "}, {" $ match ": {" keys ": {" $ in ": [{" $ regex ":" text "," $ options ":" i "}]}}} , {"$ group": {"_id": {"productId": "$ productId"}, "relatedTags": {"$ sum": 1}}}, {"$ sort": {"relatedTags": - 1}}, { "$ límite": 10}]

1

La pregunta reformulada es:

Supongamos que si las ofertas de trabajo tienen etiquetas de búsqueda adjuntos como

Colocaciones de avisos

[{_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 sensible o necesito volver a expresarlo?

+0

Eso me parece bien. Parece que la *** pregunta de 4 años *** hablaba más sobre el filtrado de resultados que la creación de parámetros de búsqueda. – monsto

+0

Esta no es una respuesta. – nilsi

+0

@nilsi Sí, esta no es una respuesta, pero traté de explicar el problema con un escenario. –

Cuestiones relacionadas