ULL-ESIT-INF-DSI-2122 / ull-esit-inf-dsi-21-22-prct12-music-api-grupo-m

ull-esit-inf-dsi-21-22-prct12-music-api-grupo-m created by GitHub Classroom
0 stars 0 forks source link

Problemas con la creacion #7

Closed JoelFEscobar closed 2 years ago

JoelFEscobar commented 2 years ago

Buenas noches @esegredo.

Estamos teniendo problemas con las peticiones en thunder client debido a que creamos una cancion luego un artista y a la hora de crear una playlist que contenga una canción o artista ya creados en la base de datos da el siguiente error

{
  "driver": true,
  "name": "MongoError",
  "index": 0,
  "code": 11000,
  "keyPattern": {
    "songs.author": 1
  },
  "keyValue": {
    "songs.author": "Billie Eilish"
  }
}

No deberia de funcionar asi y no entiendo porque falla ni como se puede solucionar, puesto que al crear una cancion y un artista funciona todo correctamente y el esquema de playlist es similar al de artista, por lo que no entendemos estos errores puesto que la peticion se hace exactamente igual

Un saludo y gracias de antemano

esegredo commented 2 years ago

Hola Joel,

Lo anterior te sucede porque tus esquemas dependen de otros esquemas, por ejemplo, el de artista depende del de canción. Cuando insertas una canción no tienes problema, pero cuando insertes un artista o una playlist con canciones ya existentes en la BBDD, te saldrá este error. Eso es porque cada esquema está asociado a una colección en la BBDD, con independencia del esquema que uses para insertar documentos. Por ejemplo si usas el de artista, como el de artista referencia a canción, las canciones que indiques al insertar un artista, se intentarán insertar en la colección de canciones y, por lo tanto, si ya existían, tendrás problemas.

Para evitar lo anterior, en su caso, lo más fácil es no referenciar a esquemas de otras colecciones, sino crearte un subesquema para las canciones que te asegures que solo usas en artista, por ejemplo, y que contenga los mismos campos que el esquema de las propias canciones.

Otra opción, que es lo que se suele hacer es utilizar ObjectID como tipo en los campos con los que quieres referenciar otras entidades o esquemas. En ese caso, para insertar un artista, por ejemplo, necesitarás los ID únicos que te crea MongoDB para las canciones, y haber introducido canciones en dicha colección como paso previo a introducir un artista.

Espero haberme explicado.

Saludos.

JoelFEscobar commented 2 years ago

tras lo que me comentó, utilice el objectID de la siguiente manera:

  songList: {
    type: [Schema.Types.ObjectId],
    required: true,
    trim: true,
    ref: 'song',
  },

La duda que me surge es como especificar los id's en las peticiones dentro de thunderClient porque al especificar un array de id's referenciados en song:

{
    "name": "Playlist8",
    "genres": ["POP"],
    "songList": [
        {
            "id": "62894544a04a6e31430edc44"

        },
        {
            "id": "628947c32c683f3314c1fb6f"

        }
    ]
}

presupongo que sería algo similar, pero sigue sin funcionar

un saludo y gracias de antemano @esegredo

esegredo commented 2 years ago

Quita lo de id, y simplemente mete id entrecomillados separados por comas.

Luego en el esquema cuidado con el nombre del modelo que referencias. Quizás sea Song y no song.

Saludos.