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

Hvordan får man alle de værdier, der indeholder en del af en streng, ved hjælp af mongoose find?

Du svarede næsten selv på dette i dine tags. MongoDB har en $regex operator, der tillader, at et regulært udtryk sendes som en forespørgsel. Så du forespørger efter strenge, der indeholder "Alex", gør du dette:

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

Du kan også gøre dette:

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

    }
);

Begge er gyldige og forskellige fra hvordan du prøvede i den korrekte understøttede syntaks som vist i dokumentationen.

Men selvfølgelig, hvis du rent faktisk spørger "hvordan får man 'array'-resultaterne kun for dem, der matcher 'Alex' et eller andet sted i strengen?" så er det lidt anderledes.

Kompleks matching for mere end én array-elementet er domænet for aggregeringsrammen (eller muligvis mapReduce, men det er meget langsommere), hvor du skal "filtrere" array-indholdet.

Du starter med stort set det samme. Nøglen her er at $unwind at "de-normalisere" array-indholdet for at kunne "filtrere" korrekt som individuelle dokumenter. Rekonstruer derefter arrayet med de "matchende" dokumenter.

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

    }
)


  1. Indstil MongoDb-konverteren programmatisk

  2. (node:3341) AfskrivningAdvarsel:Mongoose:mpromise

  3. Mulighed for at duplikerede Mongo ObjectId'er bliver genereret i to forskellige samlinger?

  4. Sådan samles efter år-måned-dag i en anden tidszone