Estoy usando el operador $regexMatch de Mongo para buscar documentos en los que al menos parte de un campo coincida con el patrón, y esto funciona bien para los campos de nivel raíz. Pero, ¿cómo lo uso con campos de matriz? Quiero devolver una coincidencia si al menos uno de los elementos de la matriz coincide con el patrón.
Por ejemplo, digamos que la colección tiene estos dos documentos:
{ "_id": ObjectId("5ff6335c1570ba63ca5ac21e"), "requirements": [ { "description": "Bachelor of Science required for this blah blah blah", "code": "ABC" }, { "description": "Also much experience in JavaScript blah", "code": "XYZ" } ] }, { "_id": ObjectId("5ff6335b1570ba63ca5abefb"), "requirements": [ { "description": "Master of Arts WANTED NOW!", "code": "TTT" }, { "description": "5+ experience required in C++", "code": "QQQ" } ] }y algo como este oleoducto
db.Collection.aggregate([ { $match: { $expr: { $regexMatch: { input: '$requirements.description', regex: /^.*?\bblah blah blah\b.*?$/im } } } } ]) debe devolver solo el primer documento, ya que su primer elemento dentro de los requirements coincide con la description que contiene "bla, bla, bla" ("Se requiere una licenciatura en ciencias para este bla, bla, bla").
Sin embargo, esto solo me arroja un error que dice '$regexMatch necesita que input sea del tipo cadena'. Y reemplazarlo con $requirements[0].description tampoco funciona.
Entonces, ¿hay alguna manera de hacer coincidir los campos de matriz de expresiones regulares en Mongo?
$regexMatch solo permite requirements de entrada de cadena que tienen una matriz Requiere iterar valores de matriz de bucle,
$reduce para iterar el bucle de description , verificar la condición si la expresión coincide y luego devolver el puntaje; de lo contrario, devolver el valor inicial db.collection.aggregate([ { $addFields: { score: { $reduce: { input: "$requirements.description", initialValue: 0, in: { $cond: [ { $eq: [ { $regexMatch: { input: "$$this", regex: "blah blah blah" } }, true ] }, 50, "$$value" ] } } } } } ]) Si desea filtrar documentos, simplemente intente $regex en la etapa $match ,
db.collection.aggregate([ { $match: { "requirements.description": { $regex: "blah blah blah" } } } ])