Мангуст — как заполнить только первый элемент во вложенном массиве каждого объекта

#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. Это именно то, что я искал! Большое вам спасибо