My FeedDiscussionsHeadless CMS
New
Sign in
Log inSign up
Learn more about Hashnode Headless CMSHashnode Headless CMS
Collaborate seamlessly with Hashnode Headless CMS for Enterprise.
Upgrade ✨Learn more

Any mnongo experts here.Plz help me on building MongoDB news feed schema design for social application

Siraj abbas's photo
Siraj abbas
·Mar 23, 2017

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:'www.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.