Il tuo "ultimo" documento sarà sempre alla fine del tuo array a meno che tu non modifichi in qualche modo. L'aggiunta di elementi negli array andrà sempre alla "fine" o "aggiungi" agli elementi esistenti se utilizzata con $push
operatore o aggiunto utilizzando metodi di manipolazione dell'array nel codice client.
Solo operatori come $addToSet
o usando esplicitamente i modificatori di $push
operazione cambierà questo.
Pertanto, alla fine di un array, ciò che in genere si desidera fare è utilizzare $slice
, con un indice negativo per ottenere elementi dalla "fine" dell'array:
Model.findById("55d3a39565698bbc68079e31")
.select({ "comments": { "$slice": -1 }})
.exec(function(err,doc) {
})
Se hai effettivamente modificato l'array come menzionato in precedenza in cui l'ultima data non è l'ultimo elemento nell'array, dovresti utilizzare $sort
modificatore sugli aggiornamenti. In genere sarebbe "fuori posto" solo se chiedessi il $position
modificatore o hai usato $addToSet
. Il $position
sarebbe deliberato e non puoi anche ordinare, ma puoi sempre ordinare l'array dopo un $addToSet
operazione come questa, che mette in ordine tutte le date senza modificare nessun altro contenuto dell'array:
Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
{ "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
)
Con l'array modificato lo stesso $slice
l'operazione si applica alle query poiché l'array è ora nell'ordine per data.
Se tuttavia la tua intenzione è lasciare l'array nei tuoi documenti fuori servizio, o nell'altro ordine che desideri, ma desideri anche ottenere l'ultima data, puoi utilizzare .aggregate()
a $sort
e recuperare il $last
voce dell'array:
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" }
}}
]
)
Notando che quando si utilizza il framework di aggregazione con mongoose, il _id
"l'autocasting" che si verifica in altre query non si verifica (questo è di progettazione), quindi è necessario eseguire il cast su un ObjectId
valuta te stesso, se i dati non sono già disponibili in quella forma e sono entrati come una stringa.
Questi sono i tuoi modi per ottenere l'ultimo elemento (facoltativamente ordinato in modo esplicito) da un array.