sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo obtener todos los valores que contienen parte de una cadena usando mongoose find?

Casi respondes esto tú mismo en tus etiquetas. MongoDB tiene un $regex operador que permite enviar una expresión regular como una consulta. Entonces, si busca cadenas que contengan "Alex", haga esto:

Books.find(
    { "authors": { "$regex": "Alex", "$options": "i" } },
    function(err,docs) { 
    } 
);

También puedes hacer esto:

Books.find(
    { "authors": /Alex/i }, 
    function(err,docs) { 

    }
);

Ambos son válidos y diferentes a cómo lo intentó en la sintaxis admitida correcta, como se muestra en la documentación.

Pero, por supuesto, si realmente está preguntando "¿cómo obtener los resultados de la 'matriz' solo para aquellos que coinciden con 'Alex' en algún lugar de la cadena?" entonces esto es un poco diferente.

Coincidencia compleja para más de uno El elemento de matriz es el dominio del marco de agregación (o posiblemente mapReduce, pero eso es mucho más lento), donde necesita "filtrar" el contenido de la matriz.

Comienzas de la misma manera. La clave aquí es $unwind para "desnormalizar" el contenido de la matriz para poder "filtrar" correctamente como documentos individuales. Luego reconstruya la matriz con los documentos "coincidentes".

Books.aggregate(
    [
        // Match first to reduce documents to those where the array contains the match
        { "$match": {
            "authors": { "$regex": "Alex", "$options": i }
        }},

        // Unwind to "de-normalize" the document per array element
        { "$unwind": "$authors" },

        // Now filter those document for the elements that match
        { "$match": {
            "authors": { "$regex": "Alex", "$options": i }
        }},

        // Group back as an array with only the matching elements
        { "$group": {
            "_id": "$_id",
            "title": { "$first": "$title" },
            "authors": { "$push": "$authors" },
            "subjects": { "$first": "$subjects" }
        }}
    ],
    function(err,results) {

    }
)