MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como obter todos os valores que contém parte de uma string usando o mangusto find?


Você quase respondeu isso em suas tags. MongoDB tem um $regex operador que permite que uma expressão regular seja submetida como uma consulta. Então você consulta por strings contendo "Alex", você faz isso:
Books.find(
    { "authors": { "$regex": "Alex", "$options": "i" } },
    function(err,docs) { 
    } 
);

Você também pode fazer isso:
Books.find(
    { "authors": /Alex/i }, 
    function(err,docs) { 

    }
);

Ambos são válidos e diferentes de como você tentou na sintaxe correta com suporte, conforme mostrado na documentação.

Mas é claro que se você está realmente perguntando "como obter os resultados de 'array' apenas para aqueles que correspondem a 'Alex' em algum lugar da string?" então isso é um pouco diferente.

Correspondência complexa para mais de um elemento array é o domínio do framework de agregação (ou possivelmente mapReduce, mas isso é muito mais lento), onde você precisa "filtrar" o conteúdo do array.

Você começa do mesmo jeito. A chave aqui é $unwind para "desnormalizar" o conteúdo da matriz para poder "filtrar" adequadamente como documentos individuais. Em seguida, reconstrua a matriz com os documentos "correspondentes".
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) {

    }
)