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

Come recuperare l'ultimo oggetto di un array in un documento incorporato in Mongoose?

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.