I want to return all chat conversations, where the logged in user (user_id) is a participant.
I want to populate the participants only returning the profile.firstname (maybe some other later), i then want to filter out the participants so that it does not bring back the loggedInUser (user_id) in the participants array.
chat.controller.js INDEX
Chat.find({participants: user_id})
.populate('participants', {
select: 'profile.firstname',
where('_id').ne(user_id) // This need to change
})
.exec(function (err, chats) { });
chat.model.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
let ChatSchema = new Schema({
participants: [{
type: Schema.Types.ObjectId, ref: 'User'
}],
messages: [{
type: Schema.Types.ObjectId, ref: 'Message'
}],
},
{
timestamps: {createdAt: 'created_at', updatedAt: 'updated_at'}
});
module.exports = mongoose.model('Chat', ChatSchema);
According to populate documentation this could be achieved by "match" option.
In your case answer would be:
Chat.find({participants: user_id})
.populate('participants', {
select: 'profile.firstname',
match: { _id: {$ne: user_id}}
})
.exec(function (err, chats) { });