заполнение поля мангуста с использованием _id собственного документа - PullRequest
0 голосов
/ 05 мая 2018

Я создаю приложение, используя стек MEAN, в котором у меня есть функция чата один на один. Я использую мангуст и имею 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 в диалоге и заполняю пользователя

затем, после получения всех разговоров, я выполняю команду 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)
                }
            })
        });
    }
})

Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...