IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NodeJS Discussion :

Mettre à jour un schéma Mongoose et afficher les données après appel de la route


Sujet :

NodeJS

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut Mettre à jour un schéma Mongoose et afficher les données après appel de la route
    Bonjour,

    Je commence Node.js et quoi de mieux que de tenter de faire une app pour comprendre son fonctionnement ^^.

    J'ai une question concernant un appel d'une API externe (TMDB) et côté client j'utilise AngularJS

    Le but est de mettre à jour les infos de la série. J'utilise http://docs.themoviedb.apiary.io/#re...discovertv/get pour sauvegarder en masse des séries télé, mais n'ayant pas toutes les infos dans cette requête je fais appel à http://docs.themoviedb.apiary.io/#reference/tv/tvid/get lorsque je visite une série sur mon application.

    Ce que je voudrais c'est éviter l'appel de MovieDB.tvInfo si dans mon schema Moogouse j'ai la valeur fully_scraped à true

    Voici mon code actuel (l'avantage de ça c'est que lors que la requête est fini, dans ma vue via angular, la valeur plot n'est pas vide et s'affiche correctement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    app.get('/api/shows/:id', function(req, res, next) {
     
        MovieDB.tvInfo({id: req.params.id, language: 'fr'}, function(err, data) {
            Show.findById(req.params.id, function(err, show) {
                if(err) return next(err);
     
                if(!show.fully_scraped) {
                    show.plot = data.overview;
                    show.fully_scraped = true;
     
                    console.log("it's now scrapped");
     
                    show.save(function(err) {
                        if (err)
                            console.log('error')
                        else
                            console.log('success')
                    });
                }
                res.send(show);
            });
        });
    });
    Autrement si je fais ceci j'évite bien la requête vers l'api de tmdb mais dans ma vue, angular ne connait pas encore la valeur de "plot"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    app.get('/api/shows/:id', function(req, res, next) {
     
        Show.findById(req.params.id, function(err, show) {
            if(err) return next(err);
     
            if(!show.fully_scraped) {
                MovieDB.tvInfo({id: req.params.id, language: 'fr'}, function(err, data) {
                    show.plot = data.overview;
                    show.fully_scraped = true;
     
                    console.log("it's now scrapped");
     
                    show.save(function(err) {
                        if (err)
                            console.log('error')
                        else
                            console.log('success')
                    });
                });
     
     
     
            }
            res.send(show);
        });
    });
    Comment optimiser tout ça ?

    Merci d'avance.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    Comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    app.get('/api/shows/:id', function(req, res, next) {
     
        Show.findById(req.params.id, function(err, show) {
            if(err) return next(err);
     
            if (show.fully_scraped) return res.send(show);
     
            MovieDB.tvInfo({id: req.params.id, language: 'fr'}, function(err, data) {
                    show.plot = data.overview;
                    show.fully_scraped = true;
     
                    console.log("it's now scrapped");
     
                    show.save(function(err) {
                        if(err) return next(err);
                        res.send(show);
                    });
                });
            }
     
        });
    });
    la fonction "return" met fin à la fonction en renvoyant son résultat.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut
    Merci pour ta réponse, au final pour mieux structurer le code j'utilise async.waterfall pour faire une suite d'exécution. (Je sais pas si c'est mieux mais bon).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    app.get('/api/shows/:id', function(req, res, next) {
     
        async.waterfall([
            function(callback) {
                Show.findById(req.params.id, function(err, show) {
                    if(err) return next(err);
                    if(show.fully_scraped) {res.send(show); return;}
                    callback(err, show);
                });
            },
            function(show, callback) {
                MovieDB.tvInfo({id: show._id, language: 'fr'}, function(err, data) {
     
                    show.plot = data.overview;
                    show.background = 'http://image.tmdb.org/t/p/w780' + data.backdrop_path;
                    show.episode_count = data.number_of_episodes;
                    show.tmdb_id = data.id;
                    show.poster = 'http://image.tmdb.org/t/p/w342' + data.poster_path;
                    show.season_number = data.number_of_seasons;
                    show.fully_scraped = true;
                    show.in_production = data.in_production;
                    show.last_air_date = data.last_air_date;
     
                    console.log('info');
                    callback(err, show, data);
                });
            },
            function(show, data) {
                var seasons = data.seasons;
                var seasonsArray = [];
     
                _.each(seasons, function(season) {
                    if(season.season_number != 0) {
                        seasonsArray.push({
                            release_date: season.air_date,
                            episode_count: season.episode_count,
                            tmdb_id: season.id,
                            poster: 'http://image.tmdb.org/t/p/w342' + season.poster_path,
                            season_number: season.season_number,
                            fully_scraped: true,
                            allow_update: false,
                        });
                    }
                });
     
                show.fully_scraped = true;
                show.seasons = seasonsArray;
     
                show.save(function(err) {
                    if (err)
                        console.log('error')
                    else {
                        console.log('saved')
                    }
                });
     
     
     
                res.send(show);
            }
        ]);
     
    });

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    au final pour mieux structurer le code j'utilise async.waterfall pour faire une suite d'exécution. (Je sais pas si c'est mieux mais bon).
    Bha non, pas tellement. waterfall sert effectivement à mieux structurer le code (Control Flow), alors que eachSeries sert à gérer les collections de façon asynchrone; parce que ta boucle _.each, elle est bloquante tout le temps de son traitement... rien ne t'empeche d'ailleurs de coupler les deux, waterfall et eachSeries, mais dans ton cas, pour deux malheureux callback, waterfall me semble un peu overkilled.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut
    Ah ok, j'ai voulu m'inspirer de ça : https://github.com/sahat/tvshow-trac...server.js#L249

    Dans mon cas, lorsque je visite une série, je voudrais ajouter les données de la série via mongoose, saisons et épisodes. Pour toi quelle est la bonne pratique à appliquer ? Sachant que par la suite, il faudra gérer un event (genre toute les semaines) pour mettre à jour la série (le nombre de saisons, nombre d'épisodes) et ajouter les nouveau épisode chaque semaine (pour avertir par la suite un utilisateur).

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    En fait, quand je t'ai répondu, j'avais en tête un autre fil de discussion process out of memory, où il est question d'un problème de boucle avec 350000 éléments... j'ai un peu tout mélangé...

    toujours est-il que:

    Ah ok, j'ai voulu m'inspirer de ça
    Dans la mesure où il fait 3 request et 3 parsage, soit 6 callback, waterfall est parfaitement justifié. En comparaison, pour tes deux callbacks c'est à mon sens ajouter de la complexité, mais tu fais comme tu le sens.

    Pour toi quelle est la bonne pratique à appliquer ?
    De façon générale, les boucles tel qu'on les pratiques avec JavaScript, càd synchrone, ne sont pas appropriés avec Node, d'où toutes les fonctions que propose Async.js dans la partie «Collections» pour les traiter.

    Comme dis précédemment, la boucle d'underscore est bloquante, si ta collection a 10 éléments, ce n'est pas bien méchant, si c'est 100000 c'est pas bon, car dans l'intervalle du traitement ton serveur n'est plus disponible pour répondre aux nouvelles requêtes, à toi de voir en fonction de la quantité de données à traiter. Mais encore une fois, quand je t'ai parlé de Async.eachSeries, va savoir pourquoi, je pensais à 350000 éléments et pas du tout à la bonne problématique.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut
    Ok, merci pour ces précisions . Autre chose, concernant la structure de mes documents mongoose, est-ce mieux de tout mettre dans un document Show qui contient un tableau d'objet contenant les seasons et ce même tableau seasons contenant les épisodes ou alors un document pour show, season et episode et les lié via des relations ? Sachant que par la suite je vais devoir lié des séries à des utilisateurs, ainsi que des épisodes (pour savoir si ils l'ont vu ou pas).

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    concernant la structure de mes documents mongoose
    Ça c'est une question qu'elle est bonne, mais relève de la création de schéma Mongodb, qui est toujours un peu délicat car très liés à l'application et à ces usages, puisque tout est dé-normalisé.

    est-ce mieux de tout mettre dans un document Show qui contient un tableau d'objet contenant les seasons et ce même tableau seasons contenant les épisodes (...)
    Que contient ton document Show à part Les saisons? Quels sont tes vues (en gros, qu'elles seront les requêtes les plus fréquentes) ? Pourquoi une base de données orientés documents?

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut
    Mon document Show contient des informations sur la série (nom, première date de diffusion, nombre de saisons, d'épisodes, etc). Les requêtes les plus fréquentes seront, voir une série, donc récupérer les infos de cette série, saisons et épisodes et mettre à jour les informations des saisons sans doute tous les 6 mois pour être sûr et chaque semaines pour les épisodes (je pensais utiliser agenda pour ça). Il y a aussi l'utilisateur qui pourra ajouter une série à sa liste, ainsi que de définir les épisodes vu de la série.

    Et pourquoi une base de donnée orienté document ? C'est une bonne question, j'ai voulu coupler node à mongodb pour tester. Mais si je prend MySQL j'aurais besoin d'un ORM pour éviter d'écrire les requêtes et la liaison entre les tables.

    Ou alors peut-être serait il plus judicieux d'ajouter toutes les séries, saisons, épisodes via une commande qui insert les données dans des documents ou table selon ce qui est utilisé. Et pour le cron, chaque semaine je vérifie via la date des derniers épisodes diffusé + 7 jours et si il y a des nouveaux résultats, j'ajoute le nouvel épisode.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    donc récupérer les infos de cette série, saisons et épisodes
    Si tu affiche toutes les infos en une seule page >> tout dans un seul document(mais tu va t'amuser pour mettre à jour les épisodes )
    Si tu affiche les infos séries et seulement la liste des saisons alors tu sépare et dans ta collection séries tu met un tableau avec les titres des saisons qui serviront aussi de clé (même principe pour la collection saisons avec les épisodes)

    Il y a aussi l'utilisateur qui pourra ajouter une série à sa liste, ainsi que de définir les épisodes vu de la série.
    ça tu le gère dans ta collection utilisateur, avec un tableau de séries vue, et un tableau de préférence séries.

    j'aurais besoin d'un ORM pour éviter d'écrire les requêtes et la liaison entre les tables
    bha, mongoose, c'est un ODM... et la gestion des liaisons (cohérence de la suppression par exemple) tu te la cogne à la main... donc cela ce discute surtout quand on a pas mal de relations comme dans ton cas.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut
    Tout ne sera pas sur une seule page, la home affichera les séries (titre + image), quand on clic sur une série (on met à jour les infos de la série : date de lancement etc, on récupère les saisons de la série) ça affiche les saisons et lorsque qu'on clic sur une saison, on affiche les épisodes (qu'il faut aussi récupérer lorsqu'on visite la page la première fois). Ensuite c'est pour ajouter les nouvelles saisons/épisodes qui parait chaud :/. Je ne sais pas trop sur quelles conditions vérifié qu'il faut mettre à jour, la date du dernier épisodes, mais ensuite il faut que je lance un cron chaque semaine.

    Peut-être quelque chose comme ça, qu'en penses-tu ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    var showSchema = new mongoose.Schema({
        _id: Number,
        tmdb_id: Number,
        title: String,
        original_title: String,
        release_date: Date,
        year: Date,
        plot: String,
        poster: String,
        background: String,
        runtime: Number,
        number_of_seasons: Number,
        number_of_episodes: Number,
        tmdb_rating: Number,
        tmdb_popularity: Number,
        in_production: Boolean,
        last_air_date: Date,
        networks: [{
            tmdb_id: Number,
            name: String
        }],
        fully_scraped: Boolean,
        allow_update: Boolean,
        in_production: Boolean,
        seasons: [{
            type: mongoose.Schema.Types.ObjectId, ref: 'Season'
        }],
        // La personne regarde la série
        subscribers: [{
            type: mongoose.Schema.Types.ObjectId, ref: 'User'
        }],
    });
     
    var seasonSchema = new mongoose.Schema({
        _id: Number,
        release_date: Date,
        episode_count: Number,
        tmdb_id: Number,
        poster: String,
        season_number: Number,
        fully_scraped: Boolean,
        allow_update: Boolean,
        episodes: [{
            type: mongoose.Schema.Types.ObjectId, ref: 'Episode'
        }]
    });
     
    var episodeSchema = new mongoose.Schema({
        _id: Number,
        release_date: Date,
        tmdb_id: Number,
        plot: String,
        poster: String,
        season_number: Number,
        fully_scraped: Boolean,
        allow_update: Boolean,
        // La personne a vue l'épisode, on l'ajoute dans le tableau
        subscribers: [{
            type: mongoose.Schema.Types.ObjectId, ref: 'User'
        }]
    });

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    Si tu fais une tache cron, tu vas à priori passer pas un script mongo , du coup il te manque une référence sur le parent...
    par exemple, en partant de ton objet season, à quel show il correspond, pour incrémenter number_of_season?!

    sinon, cela me parait bien. Juste une réserve sur "subscribers". Vas-tu afficher dans ta page séries la liste de ceux qui l'ont sélectionné? et dans la page épisode, vas-tu afficher la liste de ceux qui l'ont regardés? si non, il vaut mieux mettre cette info dans ta collection User.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut
    Pour le cron je pensais au module agenda, notamment pour notifier par mail les utilisateurs qu'un nouvel épisode est dispo. Voir le lien du projet showtrackr que j'ai mis plus haut, d'ou le tableau subscribers dans le document show.

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    e pensais au module agenda
    Je ne le connaissais pas celui là! merci

    Petit erratum:
    (...)passer pas un script mongo , du coup il te manque une référence sur le parent...
    En fait, il n'y a pas de rapport de cause à effet (je bosse en même temps et je t'ai répondu trop vite), tu as de toute façon besoin d'une ref sur le parent de la relation.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut
    La référence sur le parent pour les saisons ? (une sorte de Serie hasMany Season, Season belongsTo Serie ?)

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    une sorte de Serie hasMany Season, Season belongsTo Serie ?
    oui

  17. #17
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut
    Je n'arrive pas à pusher les saisons dans la série :/ (ligne 95). Tu aurais une piste ? Impossible d'ajouter l'ObjectId de mes saisons dans show.seasons

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    var showSchema = new mongoose.Schema({
        _id: Number,
        tmdb_id: Number,
        title: String,
        original_title: String,
        release_date: Date,
        year: Date,
        plot: String,
        poster: String,
        background: String,
        runtime: Number,
        number_of_seasons: Number,
        number_of_episodes: Number,
        tmdb_rating: Number,
        tmdb_popularity: Number,
        in_production: Boolean,
        last_air_date: Date,
        fully_scraped: Boolean,
        allow_update: Boolean,
        in_production: Boolean,
        seasons: [{type: mongoose.Schema.Types.ObjectId, ref: 'Season'}]
    });
     
     
    var seasonSchema = new mongoose.Schema({
        _id: Number,
        release_date: Date,
        episode_count: Number,
        tmdb_id: Number,
        poster: String,
        season_number: Number,
        fully_scraped: Boolean,
        allow_update: Boolean,
        _show: {type: Number, ref: 'Show'}
    });
     
     
    app.get('/api/shows/:id', function(req, res, next) {
     
        async.waterfall([
            function(callback) {
                Show.findById(req.params.id, function(err, show) {
                    if(err) return next(err);
                    if(show.fully_scraped) {res.send(show); return;}
                    callback(err, show);
                });
            },
            function(show, callback) {
                MovieDB.tvInfo({id: show._id, language: 'fr'}, function(err, data) {
     
                    show.plot = data.overview;
                    show.background = 'http://image.tmdb.org/t/p/w780' + data.backdrop_path;
                    show.episode_count = data.number_of_episodes;
                    show.tmdb_id = data.id;
                    show.poster = 'http://image.tmdb.org/t/p/w342' + data.poster_path;
                    show.season_number = data.number_of_seasons;
                    show.fully_scraped = true;
                    show.in_production = data.in_production;
                    show.last_air_date = data.last_air_date;
     
                    show.save(function(err) {
                        if (err)
                            console.log('error');
                        else
                            console.log('success');
                    });
                    console.log('info');
                    callback(err, show, data);
                });
            },
            function(show, data) {
                var seasons = data.seasons;
                var seasonsArray = [];
     
                _.each(seasons, function(season) {
                    if(season.season_number != 0) {
                        var s = new Season({
                            _id: season.id,
                            release_date: season.air_date,
                            episode_count: season.episode_count,
                            tmdb_id: season.id,
                            poster: 'http://image.tmdb.org/t/p/w342' + season.poster_path,
                            season_number: season.season_number,
                            fully_scraped: true,
                            allow_update: false,
                            _show: show._id // Ici mon Number est bien enregistré
                        });
     
                        s.save(function(err) {
                            if (err)
                                console.log(err)
                            else {
                                console.log('season saved');
                                show.seasons.push(s._id); // J'ai une erreur avec le push : Cast to ObjectId failed for value "3247" at path "seasons"
                            }
                        });
     
                    }
                });
            }
        ]);
     
    });
    Par la suite je voudrais pouvoir faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Show.findById(serieId).populate('seasons').exec(function())

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    qu'est ce que tu n'arrives pas à faire exactement? le fait qu'il faille faire une boucle asynchrone pour enregistrer tes saisons une à une dans ta collections?

  19. #19
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut
    Le fait d'avoir une erreur de Cast à la ligne 95 via la méthode show.seasons.push() (j'ai modifié mon post 2 minutes après le tiens, peut-être qu'il te manquait des infos avant mon édition).

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    dans ton showSchema tu lui dis que seasons sera un tableau de ObjectId

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    seasons: [{type: mongoose.Schema.Types.ObjectId, ref: 'Season'}]
    et tu lui passe un _id avec une valeur issue data.season, qui doit être un String (car issue d'un json je suppose)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     var s = new Season({
                  _id: season.id, // issue de data.season
    en fait, ne réécrit pas la valeur _id, laisse mongo la gérer, et crée plutôt une deuxième clé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    seasons: [{type: String, ref: 'Season'}]
    
    (...)
    
    var s = new Season({
                  id: season.id,
    
    (...)
    
    show.seasons.push(s.id);

Discussions similaires

  1. [10g] Afficher les données si il y a eu une modification à la date du jour J
    Par Loudgi dans le forum Administration
    Réponses: 4
    Dernier message: 22/05/2015, 12h36
  2. [WD-MAC 2008] docx avec schéma XML, comment afficher les balises?
    Par PouetteMan dans le forum Word
    Réponses: 3
    Dernier message: 01/12/2011, 09h56
  3. Réponses: 9
    Dernier message: 07/01/2011, 21h50
  4. Réponses: 6
    Dernier message: 06/04/2006, 20h52
  5. [MySQL] Une liste déroulante affichant les données d'une requête SHOW par ordre alphabétique
    Par jack_1981 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 22/12/2005, 15h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo