babeyh
babeyh

Reputation: 699

MongoDB create a filtered collection with 2 collections data

I have a mongo database that consist of huge github data (users, issues, repos, etc). I want to create small collections from this big data. I sorted "users" collection according to "followers" count of users. Then I got the first 1000 users from this query.

db.getCollection("users").find({}).sort({followers:-1}).limit(1000).forEach(function(doc){
db.usersnew.insert(doc);});

There is another collection called "repos" that consists of info about users' repository. (user key field :"owner.id" )

I want to create a new filtered repos collection which consists only users who present in usersnew collection.

I tried to use $look_up but it works like join.

db.getCollection('reposnew').aggregate([{
$lookup:
    {
        from: "users",
        localField: "owner:id",
        foreignField : "id",
        as: "filteredRepo"
    }
}])

It creates users collection + repos in a one collection. I want only filtered repos collection with specific users' data.

Upvotes: 0

Views: 447

Answers (1)

Tom Slabbaert
Tom Slabbaert

Reputation: 22296

You're on the right track, you just need to add an $out stage.

db.getCollection('reposnew').aggregate([
    {
        $lookup:
        {
            from: "users",
            localField: "owner.id",
            foreignField : "id",
            as: "filteredRepo"
        }
    },
    {
        $match: {
            "filteredRepo.0": {$exists: true}
        }
    },
    {
        $project: {
            filteredRepo: 0
        }
    },
    {
        $out: "newCollectionName"
    }
])

Upvotes: 2

Related Questions