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

MongoDB findet Filialdokumente und sortiert die Ergebnisse

Wie bereits erwähnt, hoffe ich, dass Ihre Dokumente tatsächlich ein Array haben, aber wenn $elemMatch für Sie funktioniert, sollten sie es tun.

Jedenfalls können Sie mit find nicht nach einem Element in einem Array sortieren. Aber es gibt einen Fall, in dem Sie dies mit tun können .aggregate() :

db.collection.aggregate([

    // Match the documents that you want, containing the array
    { "$match": {
        "nlp.entities": {
            "$elemMatch": { 
                "text": "Neelie Kroes", 
                "type": "Person"   
            }
        }
    }},

    // Project to "store" the whole document for later, duplicating the array
    { "$project": {
        "_id": {
            "_id": "$_id",
            "url": "$url",
            "nlp": "$nlp"          
        },
        "entities": "$nlp.entities"
    }},

    // Unwind the array to de-normalize
    { "$unwind": "$entities" },

    // Match "only" the relevant entities
    { "$match": {
        "entities.text": "Neelie Kroes", 
        "entities.type": "Person"   
    }},

    // Sort on the relevance
    { "$sort": { "entities.relevance": -1 } },

    // Restore the original document form
    { "$project": {
        "_id": "$_id._id",
        "url": "$_id.url",
        "nlp": "$_id.nlp"
    }}
])

Also im Wesentlichen, nachdem Sie $match Bedingung für Dokumente, die die relevante Übereinstimmung enthielten, verwenden Sie dann $project "speichern" Sie das Originaldokument in der _id Feld und $unwind eine "Kopie" des "entities"-Arrays.

Der nächste $match "filtert" die Array-Inhalte nur auf die relevanten. Dann wenden Sie den $sort an zu den "übereinstimmenden" Dokumenten.

Da das "Original"-Dokument unter _id gespeichert wurde verwenden Sie $project um die Struktur zu "wiederherstellen", mit der das Dokument tatsächlich beginnen musste.

So „sortieren“ Sie nach Ihrem übereinstimmenden Element eines Arrays.

Beachten Sie, dass wenn Sie mehrere „Übereinstimmungen“ innerhalb eines Arrays für ein übergeordnetes Dokument hatten, dann müssten Sie einen zusätzlichen $group Schritt, um den $max-Wert für das Feld "Relevanz" zu erhalten, um Ihre Sortierung abzuschließen.