Как найти последние данные в массиве в мангусте

У меня есть модель разговора, как показано ниже:

const ConvoSchema = mongoose.Schema({
    convoId: {
        type: String,
        required: true
    },
    seller: {
        type: String,
        required: true
    },
    buyer: {
        type: String,
        require: true
    },
    product: [{ type: Schema.Types.ObjectId, ref: 'Post' }],
    messages: [{ type: Schema.Types.ObjectId, ref: 'Message' }]
})

и я пытаюсь получить последнее сообщение в Convo, но не могу понять, как это сделать. Любые идеи?


person Phillip YS    schedule 20.08.2017    source источник
comment
Если вы специально не измените добавление элементов в массив с модификаторами $position или $sort на $push, то последний элемент всегда будет последним, потому что добавление новых элементов массива добавляется в конец. Поэтому вы всегда можете получить последнюю запись, используя $slice в проекции.   -  person Neil Lunn    schedule 21.08.2017


Ответы (1)


_id в основном содержит отметку времени, поэтому первый элемент, который вы получите в .find(), будет самым старым, а последний элемент будет самым новым,

поэтому, добавив сортировку вроде: { _id: -1}, вы получите самые последние данные

var Convo = mongoose.model('Convo', ConvoSchema); //init mongoose model

Convo.find()
     .limit(1)
     .sort({ _id: -1 })

вы можете удалить .limit(), если хотите полный список документов

=======================================================================

Извините, что невнимательно прочитал,

Для последнего сообщения,

Convo.findOne({}, response => {
   var data = response.toObject();
   latestMessage = data.messages.pop()
})
person imixtron    schedule 21.08.2017
comment
Вопрос запрашивает последний элемент в массиве сообщений (пытается получить последнее сообщение). Вы возвращаете последний документ, а не последний элемент в массиве внутри документа. - person Neil Lunn; 21.08.2017
comment
просто используйте .pop() в массиве сообщений. или data.messages[ data.messages.length - 1 ] также даст вам правильный результат. - person imixtron; 21.08.2017
comment
также обязательно используйте .toObject() для клонирования модели в статический объект, поэтому, если вы используете .save() для сохранения модели в том же вызове. нельзя случайно удалить последнее сообщение с помощью .pop() - person imixtron; 21.08.2017