Es la primera vez que uso MongoDB y no sé cómo crear referencias (relaciones en SQL) entre documentos que ya están insertados en mi base de datos.
Tengo dos colecciones: la primera se llama Films, y sus documentos tienen información sobre las películas (título, una URL única, descripción...). Aquí hay un ejemplo de un documento:
{ "_id": { "$oid": "6272aa886441c51b18de7b23" }, "type": "Film", "title": "Les 2 papas et la maman", "genres": "Comedia", "description": "Jérôme and Delphine want a child but Jerome is sterile. They then ask the best friend of Jerome, Salim, to be the donor for artificial insemination of the mother...", "platform": "Netflix" "film_url": "exampleurl.com" }Además, hay otra colección llamada "Actores". Cada documento de la colección "Actores" tiene información específica sobre un determinado Actor, la película en la que participa (título y una URL única) y el personaje que representa. Un documento de esta colección podría ser el siguiente:
{ "_id": { "$oid": "6272ac5b6441c51b18de9ee4" }, "name": "Sophie Rundle", "film_title": "Peaky Blinders", "film_url": "exampleurl.com", "character": "Ada Shelby", "num_episodes": "36" }Quiero crear una referencia OneToMany entre Collection Films y Collection Actors (una película tiene muchos actores y un actor representa un personaje en una película), creando una matriz dentro de cada documento Film, que contiene las identificaciones de los actores que participan en una determinada película. Para hacer eso, tengo el campo único "film_url" en ambas colecciones y tengo dos archivos CSV con los datos, así que podría leerlos e iterarlos para crear las referencias, pero no es una buena idea en términos de eficiencia. , ya que cada archivo tiene más de 10.000 líneas.
¿Existe una forma más simple y eficiente de crear estas referencias en MongoDB?
Esta es una forma de agregar y completar una matriz "actorIds" en la colección Films . Si sus colecciones son grandes, espero que esto lleve algún tiempo ya que cada película necesitará sus actores. Los índices probablemente serán útiles.
Antes de usar esto, evaluaría la advertencia de MongoDB sobre "salida a la misma colección que se está agregando" . Los bucles infinitos no son divertidos, pero dudo que eso sea un problema con esta canalización. Debe tomar su propia decisión sobre el uso de esto: es su responsabilidad (¡no la mía!). Los análisis/opiniones de expertos son bienvenidos.
db.Films.aggregate([ { "$lookup": { "from": "Actors", "localField": "film_url", "foreignField": "film_url", "pipeline": [ { "$project": { "_id": 1 } } ], "as": "actorIds" } }, { "$set": { "actorIds": { "$map": { "input": "$actorIds", "in": "$$this._id" } } } }, { "$merge": "Films" } ])Pruébalo en mongoplayground.net .