MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come ottenere tutti i valori che contengono parte di una stringa usando mongoose find?

Hai quasi risposto tu stesso nei tuoi tag. MongoDB ha un $regex operatore che consente di inviare un'espressione regolare come query. Quindi esegui una query per le stringhe contenenti "Alex" fai questo:

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

Puoi anche farlo:

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

    }
);

Entrambi sono validi e diversi da come hai provato nella corretta sintassi supportata come mostrato nella documentazione.

Ma ovviamente se stai effettivamente chiedendo "come ottenere i risultati 'array' solo per quelli che corrispondono a 'Alex' da qualche parte nella stringa?" allora questo è un po' diverso.

Corrispondenza complessa per più di uno elemento array è il dominio del framework di aggregazione (o eventualmente mapReduce, ma è molto più lento), dove è necessario "filtrare" il contenuto dell'array.

Inizi più o meno allo stesso modo. La chiave qui è $unwind per "denormalizzare" il contenuto dell'array per poter "filtrare" correttamente come singoli documenti. Quindi ricostruisci l'array con i documenti "corrispondenti".

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) {

    }
)