two inner fields ejemplo mongodb-query

mongodb-query - inner - mongodb distinct aggregation



Cómo unir varias colecciones con $ lookup en mongodb (3)

Quiero unir más de dos colecciones en MongoDB usando la búsqueda agregada $. ¿Es posible unirse? Dame algunos ejemplos.

Aquí tengo tres colecciones:

"usuarios"

{ "_id" : ObjectId("5684f3c454b1fd6926c324fd"), "email" : "[email protected]", "userId" : "AD", "userName" : "admin" }

"Información de usuario"

{ "_id" : ObjectId("56d82612b63f1c31cf906003"), "userId" : "AD", "phone" : "0000000000" }

"rol del usuario"

{ "_id" : ObjectId("56d82612b63f1c31cf906003"), "userId" : "AD", "role" : "admin" }


En realidad, puede encadenar múltiples etapas de búsqueda $. Según los nombres de las colecciones compartidas por profesor79, puede hacer esto:

db.sivaUserInfo.aggregate([ { $lookup: { from: "sivaUserRole", localField: "userId", foreignField: "userId", as: "userRole" } }, { $unwind: "$userRole" }, { $lookup: { from: "sivaUserInfo", localField: "userId", foreignField: "userId", as: "userInfo" } }, { $unwind: "$userInfo" } ])

Esto devolverá la siguiente estructura:

{ "_id" : ObjectId("56d82612b63f1c31cf906003"), "userId" : "AD", "phone" : "0000000000", "userRole" : { "_id" : ObjectId("56d82612b63f1c31cf906003"), "userId" : "AD", "role" : "admin" }, "userInfo" : { "_id" : ObjectId("56d82612b63f1c31cf906003"), "userId" : "AD", "phone" : "0000000000" } }

Tal vez esto podría considerarse un antipatrón porque MongoDB no estaba destinado a ser relacional, pero es útil.


La función de unión compatible con Mongodb 3.2 y versiones posteriores. Puede usar combinaciones mediante la consulta agregada .
Puedes hacerlo usando el siguiente ejemplo:

db.users.aggregate([ // Join with user_info table { $lookup:{ from: "userinfo", // other table name localField: "userId", // name of users table field foreignField: "userId", // name of userinfo table field as: "user_info" // alias for userinfo table } }, { $unwind:"$user_info" }, // $unwind used for getting data in object or for one record only // Join with user_role table { $lookup:{ from: "userrole", localField: "userId", foreignField: "userId", as: "user_role" } }, { $unwind:"$user_role" }, // define some conditions here { $match:{ $and:[{"userName" : "admin"}] } }, // define which fields are you want to fetch { $project:{ _id : 1, email : 1, userName : 1, userPhone : "$user_info.phone", role : "$user_role.role", } } ]);

Esto dará un resultado como este:

{ "_id" : ObjectId("5684f3c454b1fd6926c324fd"), "email" : "[email protected]", "userName" : "admin", "userPhone" : "0000000000", "role" : "admin" }

Espero que esto te ayude a ti oa alguien más.

Gracias


Según la documentation , $ lookup solo puede unirse a una colección externa.

Lo que podría hacer es combinar userInfo y userRole en una colección, ya que el ejemplo proporcionado se basa en un esquema de base de datos relacional. Mongo es una base de datos noSQL, y esto requiere un enfoque diferente para la gestión de documentos.

Consulte a continuación la consulta de 2 pasos, que combina userInfo con userRole, creando una nueva colección temporal utilizada en la última consulta para mostrar datos combinados. En la última consulta hay una opción para usar $ out y crear una nueva colección con datos combinados para su uso posterior.

crear colecciones

db.sivaUser.insert( { "_id" : ObjectId("5684f3c454b1fd6926c324fd"), "email" : "[email protected]", "userId" : "AD", "userName" : "admin" }) //"userinfo" db.sivaUserInfo.insert( { "_id" : ObjectId("56d82612b63f1c31cf906003"), "userId" : "AD", "phone" : "0000000000" }) //"userrole" db.sivaUserRole.insert( { "_id" : ObjectId("56d82612b63f1c31cf906003"), "userId" : "AD", "role" : "admin" })

"únete" a todos ellos :-)

db.sivaUserInfo.aggregate([ {$lookup: { from: "sivaUserRole", localField: "userId", foreignField: "userId", as: "userRole" } }, { $unwind:"$userRole" }, { $project:{ "_id":1, "userId" : 1, "phone" : 1, "role" :"$userRole.role" } }, { $out:"sivaUserTmp" } ]) db.sivaUserTmp.aggregate([ {$lookup: { from: "sivaUser", localField: "userId", foreignField: "userId", as: "user" } }, { $unwind:"$user" }, { $project:{ "_id":1, "userId" : 1, "phone" : 1, "role" :1, "email" : "$user.email", "userName" : "$user.userName" } } ])