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

Wie rufe ich das letzte Objekt eines Arrays in einem eingebetteten Dokument in Mongoose ab?

Ihr "neuestes" Dokument befindet sich immer am Ende Ihres Arrays, es sei denn, Sie ändern es irgendwie. Das Hinzufügen von Elementen zu Arrays geht immer an das „Ende“ oder „Anhängen“ an die vorhandenen Elemente, wenn es mit dem $push -Operator oder mithilfe von Array-Manipulationsmethoden im Client-Code hinzugefügt.

Nur Operatoren wie $addToSet oder explizit Modifikatoren für $push verwenden Betrieb wird dies ändern.

Daher sollten Sie am Ende eines Arrays normalerweise $slice , mit einem negativen Index, um Elemente vom "Ende" des Arrays abzurufen:

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

    })

Wenn Sie das Array tatsächlich wie zuvor erwähnt geändert haben, wobei das späteste Datum nicht das letzte Element im Array ist, sollten Sie den $sort Modifikator bei Updates. Es wäre im Allgemeinen nur "fehl am Platz", wenn Sie nach der $position fragen würden Modifikator oder Sie haben $addToSet verwendet . Die $position wäre absichtlich und Sie können nicht auch sortieren, aber Sie können das Array immer nach einem $addToSet sortieren Operation wie diese, die alle Daten in eine Reihenfolge bringt, ohne den anderen Inhalt des Arrays zu ändern:

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

Mit dem modifizierten Array dasselbe $slice Der Vorgang gilt für Abfragen, da das Array jetzt nach Datum geordnet ist.

Wenn Sie jedoch beabsichtigen, das Array in Ihren Dokumenten in der falschen Reihenfolge oder in der anderen gewünschten Reihenfolge zu belassen, aber auch das neueste Datum erhalten möchten, können Sie .aggregate() zu $sort und rufen Sie $last ab Array-Eintrag:

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

Beachten Sie, dass bei Verwendung des Aggregationsframeworks mit Mongoose die _id "Autocasting", das in anderen Abfragen auftritt, findet nicht statt (das ist beabsichtigt), daher ist es notwendig, in eine ObjectId zu konvertieren schätzen, wenn die Daten nicht schon in dieser Form vorliegen und als String reingekommen sind.

Das sind Ihre Möglichkeiten, um das letzte Element ( optional explizit sortiert ) aus einem Array zu erhalten.