Search code examples
mongodbjoinnosql

How to do inner joining in MongoDB?


Is it possible to do SQL inner joins kind of stuff in MongoDB?

I know there is the $lookup attribute in an aggregation pipeline and it is equivalent to outer joins in SQL, but I want to do something similar to inner joins.

I have three collections which need to merge together:

// User Collection
db.User.find({});

// Output:
{
   ID : 1,
   USER_NAME : "John",
   password : "pass"
}
{

   ID : 2,
   USER_NAME : "Andrew",
   PASSWORD : "andrew"
}

// Role Collection
db.ROLE.find({});

// Output:
{
   ID : 1,
   ROLE_NAME : "admin"
},
{
    ID : 2,
    ROLE_NAME : "staff"
}

// USER_ROLE Collection
db.USER_ROLE.find({});

// Output:
{
   ID : 1,
   USER_ID : 1,
   ROLE_ID : 1
}

I have the above collections and I want to extract only the documents matched with users and their respective roles, not all the documents. How can I manage it in MongoDB?


Solution

  • As Tiramisu wrote this looks like schema issue.

    You can make a manual inner join, by removing documents where $lookup returned empty array.

    ....
    {$lookup... as myArray},
    {$match: {"myArray":{$ne:[]}}},
    {$lookup... as myArray2},
    {$match: {"myArray2":{$ne:[]}}},
    

    schema change

    I personally will go for schema update, like this:

    db.User.find({})
    {
       ID : 1,
       USER_NAME : "John",
       password : "pass"
       roles:[{ID : 1,  ROLE_NAME : "admin"}]
    }
    
    
    db.ROLE.find({})
    {
       ID : 1,
       ROLE_NAME : "admin"
    },