sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB najde vnořený dokument a seřadí výsledky

Jak bylo uvedeno, doufám, že vaše dokumenty skutečně pole mají, ale pokud vám $elemMatch funguje, pak by měly.

V žádném případě nemůžete třídit podle prvku v poli pomocí funkce find. Existuje však případ, kdy to můžete provést pomocí .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"
    }}
])

Takže v podstatě po provedení $match podmínku pro dokumenty, které obsahovaly příslušnou shodu, pak použijete $project "uložte" původní dokument do _id pole a $unwind "kopie" pole "entit".

Další $match "filtruje" obsah pole pouze na ty, které jsou relevantní. Poté použijete $sort na "spárované" dokumenty.

Protože "originální" dokument byl uložen pod _id , používáte $project k "obnovení" struktury, kterou dokument ve skutečnosti musel začínat.

To je způsob, jakým „třídíte“ podle vašeho shodného prvku pole.

Všimněte si, že pokud měli jste více "shod" v poli pro nadřazený dokument, pak byste museli použít další $group fázi, abyste získali maximální hodnotu $ pro pole „relevance“, aby bylo možné dokončit řazení.




  1. Mongodb:řazení dokumentů podle objektů pole

  2. Problém MongoDB NumberLong/$numberLong při převodu zpět na Java Object

  3. Registrace nefunguje - Server vrací kód chyby 404

  4. Apache Phoenix pro CDH