Para los talluditos como yo, a veces se nos hace cuesta arriba el MongoDb y las NoSQL, porque cosas que en la bases de datos tradicionales SQL, era sencillísimo, en NoSQL se lía un poco parda.
El caso es que para hacer una típica inner join de toda la vida entre dos tablas:
Select * from TablaA inner join TablaB on (TablaA.idA = TablaB.idB)
Pues tenemos que hacer algo como así:
db.getCollection('TablaA').aggregate([ { "$lookup": { "from": "TablaB", "foreignField": "idB", "localField": "idA", "as": "alias_tablaB" }} ]);
Join de colecciones mongoDb con _id de tipo ObjectId
Pero si resulta que la join es entre un _id, es decir un ObjectId y un campo string normal con el mismo id.
Por ejemplo en LoopBack, al crear campos de relacción enlazados contra los ids de otras tablas, los va a crear automáticamente de tipo string, pero si intentas consultarlo directamente desde mongo, tienes que tener cuidado con los _id, porque son ObjectId().
Bueno pues en este caso tenemos que convertir previamente el _id a string para que pueda hacer la comparación correctamente, y quedaría así:
db.getCollection('TablaA').aggregate([ { "$addFields": { "idA": { "$toString": "$_id" }}}, { "$lookup": { "from": "TablaB", "foreignField": "idB", "localField": "idA", "as": "alias_tablaB" }} ]);
Y esta tontería te puede hacer perder bastante tiempo.
David says
Util
Jacob Nuñez Garcia says
Gracias por la información, es de gran ayuda para los que apenas vamos aprendiendo a utilizan MongoDB, saludos.