I'm trying to find entry in a collection using mongoose, but I want only entries which have an entry in another collection.
To be more specific:
I have a collection 'post'
var postSchema = new Schemas({
postedBy:{type: mongoose.Schema.Types.ObjectId, ref: 'User'},
group:{type: mongoose.Schema.Types.ObjectId, ref: 'Group'},
postContent: String
});
a collection 'group':
var groupSchema = new Schemas({
name: String,
creator:{type: mongoose.Schema.Types.ObjectId, ref: 'User'},
interes: String,
public: Boolean
});
and a collection 'groupMember':
var groupMemeberSchema = new Schemas({
group:{type: mongoose.Schema.Types.ObjectId, ref: 'Group'},
user:{type: mongoose.Schema.Types.ObjectId, ref: 'User'}
});
What I want is to retrieve all post from groups that the user is a member in.
Something like:
groupmembers.find({user: req.user._id}, (err, groupsThatTheUserIn) => {
post.find(({$where: this.group EXIST_IN(groupsThatTheUserIn)}, (err, posts) => {
res.json(posts);
}))
})
But their is no exist_in() function in mongoose
To retrieve all post from groups that the user is a member in, you can use the aggregation framework where $lookup
is at your disposal to join the related collections with a single query.
For example, running the following aggregate operation will return the desired posts:
groupmembers.aggregate([
{ "$match": { "user": mongoose.Types.ObjectId(req.user._id) } },
{
"$lookup": {
"from": "posts",
"localField": "group”,
"foreignField": "group",
"as": "posts"
}
},
{
], (err, results) => res.json(results[0].posts))