sql >> Database >  >> NoSQL >> MongoDB

Hoe krijg je alle waarden die een deel van een string bevatten met behulp van mangoest find?

Je hebt dit bijna zelf beantwoord in je tags. MongoDB heeft een $regex operator waarmee een reguliere expressie als een query kan worden ingediend. Dus als je zoekt naar strings die "Alex" bevatten, doe je dit:

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

Je kunt dit ook doen:

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

    }
);

Beide zijn geldig en verschillen van hoe je het hebt geprobeerd in de juiste ondersteunde syntaxis zoals getoond in de documentatie.

Maar natuurlijk, als je je echt afvraagt:"hoe krijg je de 'array'-resultaten alleen voor de resultaten die ergens in de string met 'Alex' overeenkomen?' dan is dit een beetje anders.

Complexe overeenkomsten voor meer dan één array-element is het domein van het aggregatieraamwerk (of mogelijk mapReduce, maar dat is veel langzamer), waar u de array-inhoud moet "filteren".

Je begint ongeveer hetzelfde. De sleutel hier is om $unwind om de array-inhoud te "de-normaliseren" om op de juiste manier te kunnen "filteren" als afzonderlijke documenten. Reconstrueer vervolgens de array met de "overeenkomstige" documenten.

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. spring session redis 'Er is geen boon met de naam 'springSessionRepositoryFilter' gedefinieerd'

  2. Kon geen verbinding maken met Redis om 10.XX.XX.28:6379:onbekende fout - tijdens toegang vanaf Spring Batch of Windows-machine

  3. MongoDB:zoek subdocument in parameters voor matrixovereenkomst

  4. doRedis retourneert fouten in Windows 8 x64 voor verschillende Redis-serverbuild