Any mnongo experts here.Plz help me on building MongoDB news feed schema design for social application
am developing a social application in which user can upload photo albums, update their status and follow other users. I am using Node.js + MongoDB. I have a requirement to display news feeds in which each user gets the update of his followers.
Here is my schema design:
1 profile collection
`{
_id:'p1',
name:'siraj'
}
2 followers collection
{
profileId:2,
followerId:3
}
profile_album collection
{
_id:al1,
ownerId:1,
imageUrl:'google.com'
}
profile_status collection
{
_id:st1,
text:'hey im fine'
}
action collection
{
_id:ac1,
actorId:1,
sourceId:'al1',
sourceType:'album'
}
{
_id:ac1,
actorId:1,
sourceId:'st1',
sourceType:'status'
}
user_feed collection
{
_id:1,
profileId:1,
actionId:ac1
}
I need to get the feed items with profile-status and album details.
Can someone help me to build the query? I tried $lookup
but it can select only one document at a time (either the album or status). I need to query both status and album feeds. How to do it if I use separate query and sort in desc order of date.
Here is the aggregation code that I tried:
mongoUtil.db().collection('feed_action').aggregate([
{$match: {actorId: ObjectId(profileId), hidden: false}},
{$sort: {'created_date': -1}},
{$skip: offset}, {$limit: count},
{
$lookup: {
from: "profile",
localField: "actorId",
foreignField: "_id",
as: "actor"
}
},
//{$unwind: '$actor'},
{
$unwind: {
path: "$actor",
preserveNullAndEmptyArrays: true
}
},
{
$lookup: {
from: "profile_album",
localField: "sourceId",
foreignField: "_id",
as: "profileAlbum"
}
},
{
$unwind: {
path: "$profileAlbum",
preserveNullAndEmptyArrays: true
}
},
{$match: {'profileAlbum.status': 1}},
{
$lookup: {
from: "media",
localField: "mediaId",
foreignField: "_id",
as: "media"
}
},
//{$unwind: '$media'},
{
$unwind: {
path: "$media",
preserveNullAndEmptyArrays: true
}
},
{
$project: {
actor: {
Password: 0,
HashPassword: 0,
ZodiacSign: 0,
RoleId: 0,
Geners: 0,
Interests: 0,
Dob: 0,
CreatedDate: 0,
Gender: 0,
Status: 0,
SystemFileName: 0,
FileName: 0,
Path: 0,
PrivateProfile: 0
},
media: {
_id: 0,
systemFileName: 0,
source: 0,
profileId: 0,
created_date: 0,
updated_date: 0
}
}
},
{
$project: {
action: {
'actionId': '$_id',
'description': '$description',
"source": "$source",
"sourceId": "$sourceId",
"created_date": "$created_date",
'profileAlbum': {
"_id": "$profileAlbum._id",
"profileId": "$profileAlbum.profileId",
"title": '$profileAlbum.title',
"likes": '$profileAlbum.likes',
"comments": '$profileAlbum.comments'
}
}, actor: 1, media: 1, _id: 0
}
}
])
Thanks in advance.