sql >> Database >  >> NoSQL >> MongoDB

Hoe het laatste object van een array op te halen in een ingesloten document in Mongoose?

Uw "laatste" document zal altijd aan het einde van uw array staan, tenzij u het op de een of andere manier wijzigt. Het toevoegen van items aan arrays gaat altijd naar het "end" of "add" aan de bestaande items bij gebruik met de $push operator of toegevoegd met behulp van array-manipulatiemethoden in clientcode.

Alleen operators zoals $addToSet of expliciet gebruik van modifiers voor de $push operatie zal dit veranderen.

Als zodanig, wanneer u aan het einde van een array bent, wilt u meestal $slice , met een negatieve index om items van het "einde" van de array te krijgen:

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

    })

Als je de array daadwerkelijk hebt gewijzigd zoals eerder vermeld, waarbij de laatste datum niet het laatste element in de array is, dan zou je de $sort modifier op updates. Het zou over het algemeen alleen "niet op zijn plaats" zijn als je om de $position . vraagt modifier of je hebt $addToSet gebruikt . De $position zou opzettelijk zijn en je kunt niet ook sorteren, maar je kunt de array altijd sorteren na een $addToSet operatie als deze, die de alls de datums op volgorde plaatst zonder enige andere inhoud van de array te veranderen:

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

Met de array gewijzigd dezelfde $slice bewerking is van toepassing op query's omdat de array nu in de volgorde op datum staat.

Als het echter uw bedoeling is om de array in uw documenten niet op volgorde te laten staan, of in de andere volgorde die u wilt, maar u wilt ook de laatste datum krijgen, dan kunt u .aggregate() naar $sort en haal de $last op matrixinvoer:

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

Merk op dat bij gebruik van het aggregatieraamwerk met mangoest, de _id "autocasting" dat in andere zoekopdrachten gebeurt, gebeurt niet (dit is inherent aan het ontwerp), dus het is noodzakelijk om te casten naar een ObjectId waardeer jezelf, als de gegevens nog niet in die vorm beschikbaar zijn en als een string zijn binnengekomen.

Dat zijn jouw manieren om het laatste element (optioneel expliciet gesorteerd) uit een array te halen.




  1. MongoDB-aggregatie lijkt erg traag

  2. Willekeurige, schemaloze gegevens in HTML weergeven met node.js / mongodb

  3. Hoe verbinding te maken met mongoDB Atlas met behulp van mangoest

  4. Hoe de nieuwste versie van mongodb-clients op Ubuntu te installeren?