1. Introducción
En el siguiente post veremos como hacer joins entre documentos en MongoDB haciendo uso de la función lookup.
2. Colecciones
Colección de usuarios
db.user.insert({"_id":"1","name":"admin","surname":"admin","gender":"male","roles":["ROLE_ADMIN"]})
db.user.insert({"_id":"2","name":"Jorge","surname":"HernándezRamírez","gender":"male","roles":["ROLE_ADMIN"],"teams":[{"name":"UD.LasPalmas","sport":"Football"},{"name":"RealMadrid","sport":"Football"},{"name":"McLaren","sport":"F1"}]})
db.user.insert({"_id":"3","name":"Jose","gender":"male","surname":"HernándezRamírez","roles":["ROLE_USER"],"teams":[{"name":"UD.LasPalmas","sport":"Football"},{"name":"MagnusCarlsen","sport":"Chess"}]})
db.user.insert({"_id":"4","name":"Raul","surname":"GonzálezBlanco","gender":"male","roles":["ROLE_USER"],"teams":[{"name":"RealMadrid","sport":"Football"},{"name":"RealMadrid","sport":"Basketball"}]})
db.user.insert({"_id":"5","name":"Constanza","surname":"RamírezRodríguez","gender":"female","roles":["ROLE_USER"],"teams":[{"name":"UD.LasPalmas","sport":"Football"}]})
Colección de cuentas
db.account.insert({"_id":"1","userId":"1","account":"ES9121000418450200051332"})
db.account.insert({"_id":"2","userId":"1","account":"ES1800491500042710151321"})
db.account.insert({"_id":"3","userId":"2","account":"ES3320805801143040000499"})
3. Lookup
Simulamos un left join entre user y account
db.user.aggregate([
{
$lookup:
{
from: "account",
localField: "_id",
foreignField: "userId",
as: "accounts"
}
},
{
$project:
{_id: 0, surname: 0, gender: 0, roles: 0}
}
]);
Obtenemos
{ "name" : "admin", "accounts" : [ { "_id" : "1", "userId" : "1", "account" : "ES9121000418450200051332" }, { "_id" : "2", "userId" : "1", "account" : "ES1800491500042710151321" } ] }
{ "name" : "Jorge", "teams" : [ { "name" : "UD. Las Palmas", "sport" : "Football" }, { "name" : "Real Madrid", "sport" : "Football" }, { "name" : "McLaren", "sport" : "F1" } ], "accounts" : [ { "_id" : "3", "userId" : "2", "account" : "ES3320805801143040000499" } ] }
{ "name" : "Jose", "teams" : [ { "name" : "UD. Las Palmas", "sport" : "Football" }, { "name" : "Magnus Carlsen", "sport" : "Chess" } ], "accounts" : [ ] }
{ "name" : "Raul", "teams" : [ { "name" : "Real Madrid", "sport" : "Football" }, { "name" : "Real Madrid", "sport" : "Basketball" } ], "accounts" : [ ] }
{ "name" : "Constanza", "teams" : [ { "name" : "UD. Las Palmas", "sport" : "Football" } ], "accounts" : [ ] }
Simulamos un inner join entre user y account
db.user.aggregate([
{
$lookup:
{
from: "account",
localField: "_id",
foreignField: "userId",
as: "accounts"
}
},
{
$match: {accounts: {$ne: []}}
},
{
$project:
{_id: 0, surname: 0, gender: 0, roles: 0, teams: 0}
}
]);
Obtenemos