sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur hämtar man en arrays sista objekt i ett inbäddat dokument i Mongoose?

Ditt "senaste" dokument kommer alltid att finnas i slutet av din array om du inte ändrar på något sätt. Att lägga till objekt i arrayer kommer alltid att gå till "slutet" eller "lägga till" till de befintliga objekten när det används med $push operatör eller tillagd med arraymanipulationsmetoder i klientkod.

Endast operatörer som $addToSet eller uttryckligen använda modifierare till $push operation kommer att ändra detta.

Som sådan, när du är i slutet av en array, vad du vanligtvis vill göra är att använda $slice , med ett negativt index för att hämta objekt från "änden" av arrayen:

Model.findById("55d3a39565698bbc68079e31")
    .select({ "comments": { "$slice": -1 }})
    .exec(function(err,doc) {

    })

Om du faktiskt har modifierat arrayen som tidigare nämnts där det senaste datumet inte är det sista elementet i arrayen bör du använda $sort modifierare på uppdateringar. Det skulle i allmänhet bara vara "malplacerat" om du bad om $position modifierare eller så använde du $addToSet . $position skulle vara avsiktligt och du kan inte också sortera, men du kan alltid sortera arrayen efter en $addToSet operation som denna, som placerar alla datum i ordning utan att ändra något annat innehåll i arrayen:

Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
   { "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
)

Med arrayen modifierad samma $slice operationen gäller för frågor eftersom arrayen nu är i ordning efter datum.

Om din avsikt är att lämna arrayen i dina dokument ur funktion, eller i den ordning du vill ha, men du också vill få det senaste datumet, kan du använda .aggregate() till $sort och hämta $last arraypost:

Model.aggregate(
    [
        { "$match": { "_id": ObjectID("55d3a39565698bbc68079e31") } },
        { "$unwind": "$comments" },
        { "$sort": { "comments.date": 1 } },
        { "$group": {
            "_id": "$_id",
            "author": { "$first": "$author" },
            "link": { "$first": "$link" },
            "title": { "$first": "$title" },
            "date": { "$first": "$date" },
            "comments": { "$last": "$comments" }
        }}
    ]
)

Notera att när du använder aggregeringsramverket med mongoose, _id "autocasting" som sker i andra frågor sker inte (detta är designat), så det är nödvändigt att casta till ett ObjectId värdera dig själv, om data inte redan är tillgänglig i den formen och har kommit in som en sträng.

Det är dina sätt att få det sista elementet (valfritt explicit sorterat) från en array.




  1. Hur hämtar man ett värde från mongoDB, efter dess nyckelnamn?

  2. MongoDB Aggregation Framework Stadier och pipelining

  3. MongoDB Compass problem med WSL2

  4. Lokal SQLite vs Remote MongoDB