sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan henter man et arrays sidste objekt i et indlejret dokument i Mongoose?

Dit "seneste" dokument vil altid være i slutningen af ​​dit array, medmindre du på en eller anden måde ændrer. Tilføjelse af elementer i arrays vil altid gå til "enden" eller "tilføje" til de eksisterende elementer, når det bruges med $push operator eller tilføjet ved hjælp af array-manipulationsmetoder i klientkode.

Kun operatører som $addToSet eller eksplicit ved at bruge modifikatorer til $push operation vil ændre dette.

Som sådan, når du er i slutningen af ​​et array, er det, du typisk vil gøre, at bruge $slice , med et negativt indeks for at hente elementer fra "enden" af arrayet:

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

    })

Hvis du faktisk har ændret arrayet som nævnt tidligere, hvor den seneste dato ikke er det sidste element i arrayet, bør du bruge $sort modifikator på opdateringer. Det ville generelt kun være "malplaceret", hvis du bad om $position modifier eller du brugte $addToSet . $position ville være bevidst, og du kan ikke også sortere, men du kan altid sortere arrayet efter en $addToSet operation som denne, som placerer alle datoerne i rækkefølge uden at ændre noget andet indhold i arrayet:

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

Med arrayet ændret den samme $slice operationen gælder for forespørgsler, da arrayet nu er i rækkefølge efter dato.

Hvis din hensigt er at lade arrayet i dine dokumenter være ude af rækkefølge, eller i den anden rækkefølge, du ønsker, men du også ønsker at få den seneste dato, så kan du bruge .aggregate() til $sort og hent $last matrixindgang:

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" }
        }}
    ]
)

Bemærk, at når du bruger aggregeringsrammen med mongoose, er _id "autocasting", der sker i andre forespørgsler, sker ikke ( dette er af design ), så det er nødvendigt at caste til et ObjectId værdi dig selv, hvis dataene ikke allerede er tilgængelige i den form og er kommet ind som en streng.

Det er dine måder at få det sidste element (eventuelt eksplicit sorteret) fra et array.




  1. Forespørgsler i MongoDB

  2. Samlet $lookup Den samlede størrelse af dokumenter i matchende pipeline overstiger den maksimale dokumentstørrelse

  3. Lagring og forespørgsel på JSON fra en database

  4. MongoDB:klasse java.lang.Double kan ikke castes til klasse java.lang.Long