Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

287
Vistas
Buscar donde la matriz de la segunda colección tiene palabras de la matriz de la primera colección

Estoy tratando de hacer un agregado donde me gustaría relacionar elementos de una matriz a otra.

La idea es obtener oraciones relacionadas con términos donde la oración contenga todas las palabras de los elementos de términos. El resultado será un proyecto con todos los campos de texto y un campo personalizado con todos los atributos de los términos.

Aquí está mi primera colección:

 db.terms.insertMany([ { "_id" : 1, "items" : ["sun", "day"] }, { "_id" : 2, "items" : ["moon", "night"] }, ])

Y el segundo:

 db.texts.insertMany([ { "_id" : 1, "sentence" : ["a beautiful sun makes a bright day", "not usefull here"] }, ])

El agregado de intenciones:

 db.texts.aggregate([ {$lookup: { from: "terms", let: { term_items: "$items" }, pipeline: [ { $match: { $expr: { "$sentence": { $all: "$$term_items" } } } } ], as: "term_obj" }}, ]);

Cuando ejecuto este agregado recibo este error:

org.graalvm.polyglot.PolyglotException: el comando falló con el error 168 (InvalidPipelineOperator): 'Expresión no reconocida '$$term_items' en el servidor localhost:27019. La respuesta completa es {"ok": 0.0, "errmsg": "Expresión no reconocida '$$term_items'", "code": 168, "codeName": "InvalidPipelineOperator"}

Otra intención:

 db.texts.aggregate([ {$lookup: { from: "terms", let: { term_items: "$items" }, pipeline: [ { $match: { $expr: { $in: ["$$term_items", "$sentence"] } } } ], as: "term_obj" }}, ]);

El error:

org.graalvm.polyglot.PolyglotException: el comando falló con el error 40081 (Ubicación 40081): '$in requiere una matriz como segundo argumento, encontrado: falta' en el servidor localhost: 27019. La respuesta completa es {"ok": 0.0, "errmsg": "$in requiere una matriz como segundo argumento, encontrado: faltante", "code": 40081, "codeName": "Location40081"}

¿Qué me estoy perdiendo aquí?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

En la búsqueda existente, está utilizando $items antes de que tenga un valor. $let es donde debería asignar $sentence del documento externo a una variable.

Una posible solución para realizar esta búsqueda:

  • $mapa sobre la matriz de sentence
  • para cada oración, $reduce sobre la matriz de items y prueba con $in
  • $reduce sobre la matriz resultante de valores booleanos para ver si hubo una oración que coincidiera con todos los elementos
  • prueba el resultado usando $match y $expr
 db.texts.aggregate([ {$lookup: { from: "terms", let: {sentences: "$sentence"}, pipeline: [ {$match: { $expr: { $reduce: { initialValue: false, input: { $map: { input: "$$sentences", as: "sentence", in: {$reduce: { input: "$items", initialValue: "true", in: {$and: [ "$$value", {$regexMatch: { regex: "$$this", input: "$$sentence" }} ]} }} } }, in: {$or: ["$$this", "$$value"]} } } }} ], as: "term_obj" }} ])

Patio de recreo

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda