#node.js #mongodb #mongoose #populate
#node.js #mongodb #мангуст #заполнить
Вопрос:
Я пытаюсь создать приложение для чата в NodeJS, Mongoose и React Native, и я хочу показывать пользователю последнее сообщение каждого разговора.
У меня есть массив сообщений в моей схеме общения следующим образом:
const ConversationSchema = new mongoose.Schema({
{...}
messages: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'Message'
}
]
{...}
})
Интересно, может ли кто-нибудь помочь мне иметь возможность заполнять только первое сообщение каждого разговора, чтобы ответ был:
conversations: [
{
"_id": ObjectId(...)
"messages": [
"text": "Last message"
]
},
{
"_id": ObjectId(...)
"messages": [
"text": "Last message"
]
},
...
]
В настоящее время я использую populate
функцию mongoose, но проблема в том, что if заполняет только первый диалог:
Conversation.find().populate(query).exec((err, conversations => {
{...}
})
const query = {
{
path: "messages",
options: {
limit: 1,
sort: { _id: -1 }
}
}
}
Примечание: Если я не укажу limit: 1
, и sort: { _id: -1 }
он правильно заполнит все элементы массива, но это не то, что я ищу.
Спасибо всем, кто может мне помочь!
Ответ №1:
Вам нужно использовать perDocumentLimit, чем Limit
Если вам нужно правильное ограничение, вы должны использовать параметр perDocumentLimit (новый в Mongoose 5.9.0). Просто имейте в виду, что populate() выполнит отдельный запрос для каждой истории, что может привести к замедлению populate()
Комментарии:
1. Это именно то, что я искал! Большое вам спасибо