MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie bekomme ich alle Werte, die einen Teil einer Zeichenfolge enthalten, mit Mongoose Find?

Sie haben dies in Ihren Tags fast selbst beantwortet. MongoDB hat einen $regex -Operator, mit dem ein regulärer Ausdruck als Abfrage gesendet werden kann. Wenn Sie also nach Zeichenfolgen suchen, die "Alex" enthalten, gehen Sie wie folgt vor:

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

Sie können dies auch tun:

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

    }
);

Beide sind gültig und unterscheiden sich von dem, was Sie in der korrekten unterstützten Syntax versucht haben, wie in der Dokumentation gezeigt.

Aber natürlich, wenn Sie tatsächlich fragen, "wie man die 'Array'-Ergebnisse nur für diejenigen erhält, die irgendwo in der Zeichenfolge mit 'Alex' übereinstimmen?" dann ist das etwas anders.

Komplexer Abgleich für mehr als eine Das Array-Element ist die Domäne des Aggregations-Frameworks (oder möglicherweise mapReduce, aber das ist viel langsamer), wo Sie den Array-Inhalt "filtern" müssen.

Sie fangen ziemlich gleich an. Der Schlüssel hier ist $unwind um den Inhalt des Arrays zu "denormalisieren", um als einzelne Dokumente richtig "filtern" zu können. Bauen Sie dann das Array mit den "passenden" Dokumenten neu auf.

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

    }
)