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

So durchsuchen Sie Sub-Arrays in MongoDB

Wenn Sie nur eine wollen Feld, dann hat MongoDB "Punktnotation" für den Zugriff auf verschachtelte Elemente:

db.collection.find({ "to.email": "[email protected]" })

Und dies gibt übereinstimmende Dokumente zurück:

Für mehr dieses eine Feld als Bedingung, verwenden Sie $elemMatch Betreiber

db.collection.find(
    { "to": { 
        "$elemMatch": { 
            "email": "[email protected]",
            "name": "domains",
        }
    }}
)

Und Sie können eine Single "projizieren". match, um nur dieses Element zurückzugeben:

db.collection.find({ "to.email": "[email protected]" },{ "to.$": 1 })

Aber wenn Sie mehr erwarten als eine zuzuordnendes Element, dann verwenden Sie das Aggregations-Framework:

db.collection.aggregate([
    // Matches the "documents" that contain this
    { "$match": { "to.email": "[email protected]" } },

    // De-normalizes the array
    { "$unwind": "$to" },

    // Matches only those elements that match
    { "$match": { "to.email": "[email protected]" } },

    // Maybe even group back to a singular document
    { "$group": {
        "_id": "$_id",
        "from_name": { "$first": "$name" },
        "to": { "$push": "$to" },
        "subject": { "$first": "$subject" }            
    }}

])

Alle unterhaltsamen Möglichkeiten, den Inhalt eines Arrays nach Übereinstimmungen abzugleichen und/oder zu "filtern", falls erforderlich.