Mongoose - 如何只填充每个对象的嵌套数组中的第一个元素

Mongoose - How to populate only the first element in a nested array of every object

我正在尝试在 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"
        ]
    },
    ...
]

我目前正在使用 mongoose 的 populate 功能,但问题是如果只填充第一个对话:

Conversation.find().populate(query).exec((err, conversations => {
    {...}
})

const query = {
    {
        path: "messages",
        options: {
            limit: 1,
            sort: { _id: -1 }
        }
    }

}

注意:如果我没有指定 limit: 1sort: { _id: -1 },它会正确填充数组的所有元素,但这不是我要找的。

感谢任何能帮助我的人!

您需要使用 perDocumentLimit 而不是 Limit

If you need the correct limit, you should use the perDocumentLimit option (new in Mongoose 5.9.0). Just keep in mind that populate() will execute a separate query for each story, which may cause populate() to be slowe