mongoose使用自己文档的_id填充字段

时间:2018-05-05 12:48:26

标签: mongodb mongoose chat

我正在使用MEAN堆栈创建一个应用程序,其中我有一对一的聊天功能。我使用mongoose并有3个架构:

用户

{
    name: {
        type: String,
        required: true
    },
    email: {
        type: String
    },
    phone: {
        type: Number,
        required: true
    },
    profile_pic: {
        type: String,
        default: null
    },
    password: {
        type: String
    },
    salt: {
        type: String
    }
}

讯息

{
    message : {
        type : String,
        required : true
    },
    timestamp : {
        type : Number,
        required : true
    },
    from : {
        type : String,
        required : true
    },
    conversation_id : {
        type : mongoose.Schema.Types.ObjectId,
        required : true
    }
}

会话

{
    users : [ { 
                type: type : mongoose.Schema.Types.ObjectId, 
                ref : User 
             }]
}

现在,当用户转到他的信使时,我想向他展示他过去与最新消息的所有对话,所以现在我在对话和填充用户上排除了查找命令

然后在获得所有会话后,我为每个会话执行find命令以获取最新消息,因此在单个请求中对数据库进行了很多查找操作。即为什么我需要一些解决方案,如为每个对话填充最新消息(就像我可以使用对话的_id填充)

修改

以下是我现在正在使用的代码:

let completeConversations = [];
conversation.find({ "users": req.body.token_data.id }).populate({ path: 'users', select: 'name profile_pic' }).exec((err, conversations) => {
    if (err) throw err
    if (conversations.length == 0) {
        res.status(200);
        res.json({  message: "No Conversations Found" })
    } else {
        conversations.forEach(element => {
            messages.find({ conversation_id: element._id }).sort('-timestamp').limit(1).exec((err, message) => {
                if (err) {
                    res.status(200);
                    res.json({ message: "Latest Message Not Found", conversations })
                } else {
                    element = JSON.parse(JSON.stringify(element));
                    element.latest = message[0];
                    completeConversations.push(element);
                }
                if (completeConversations.length === conversations.length) {
                    res.json(completeConversations)
                }
            })
        });
    }
})

先谢谢

0 个答案:

没有答案