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

NoSQL Discussion :

[MongoDB] Le tableau de JSON s'enregistre dans le désordre en utilisant la méthode .save() de mongoose


Sujet :

NoSQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2022
    Messages : 21
    Points : 28
    Points
    28
    Par défaut [MongoDB] Le tableau de JSON s'enregistre dans le désordre en utilisant la méthode .save() de mongoose
    Bonjour,

    J'ai besoin de sauvegarder un long tableau JSON dans une collection dans une database gratuite MongoDB.

    Pour cela je me connecte à ma base de données via mongoose puis je fais une boucle for qui va lire chaque JSON de mon tableau et le sauvegarder avec le bon modèle dans la bonne collection grâce à la méthode save() de mongoose. Je fais cette connexion dans une application qui utilise nodeJS et le framework Express.

    Voici le code, que j'ai essayé de simplifier, qui fait cela :

    Code JavaScript : 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
    const data = [
      {
        "numero" : 1531,
        "annee" : 2022,
        "date" : "22/05/2022",
        "premier_cas" : 10
      },
      {
        "numero" : 1532,
        "annee" : 2022,
        "date" : "29/05/2022",
        "premier_cas" : 15
      }
    //PLUSIEURS MILLIERS D'OBJETS
    ] ;
     
    const mongoose = require('mongoose') ;
    mongoose.Promise = global.Promise ;
    const db = {} ;
    db.mongoose = mongoose ;
    db.result = require("./result.model") ;
     
    const Result = db.result ;
     
    db.mongoose
      .connect(process.env.MONGODB_URI, {
        useNewUrlParser : true,
        useUnifiedTopology : true
      })
      .then((client) => {
        console.log("Connexion réussie à MongoDB.") ;
        addResultToCollection() ;
      })
      .catch(err => {
        console.error("Erreur de connexion", err) ;
        process.exit() ;
      }) ;
     
    function addResultToCollection() {
      Result.estimatedDocumentCount(async (err, count) => {
        if (!err && count === 0) {
          for (let i = 0 ; i < data.length ; i++) {
            await createAndSaveOneResult(data[i], i) ;
          }
        } else if (count !== 0) {
          console.log("Les résultats ont déjà été créés !") ;
        }
      }) ;
    }
     
    async  function createAndSaveOneResult(json, counter) {
      new Result({
        numero : json.numero,
        annee : json.annee,
        date : json.date,
        premier_cas : json.premier_cas
      }).save(err => {
        if (err) {
          console.log("error", err) ;
        }
        console.log("Results %d a été créé", counter) ;
      }) ;
    }

    Mon modèle Result est le suivant :

    Code JavaScript : 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
    const mongoose = require('mongoose') ;
     
    const Result = mongoose.model(
        "Result",
        (new mongoose.Schema({
            numero : {
                type: Number,
                required: 'This field is required'
            },
            annee : {
                type: Number,
                required: 'This field is required'
            },
            date : {
                type: String,
                required: 'This field is required'
            },
            premier_cas : {
                type: Number,
                required: 'This field is required'
            },
        })).index({"$**" : 'text' })
    ) ;
     
    module.exports = Result;

    Ce code me permet de me connecter à ma base de données et d'enregistrer les milliers de JSON qui sont contenus dans mon tableau. Le problème est que l'enregistrement ne se fait pas dans le bon ordre, lorsque j'affiche le numéro de l'objet créé dans mon terminal au moment de sa création j'obtiens ceci :

    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
    ...
    Résultats 947 a été créé
    Résultats 942 a été créé
    Résultats 988 a été créé
    Résultats 995 a été créé
    Résultats 994 a été créé
    Résultats 1000 a été créé
    Résultats 997 a été créé
    Résultats 996 a été créé
    Résultats 987 a été créé
    Résultats 990 a été créé
    Résultats 991 a été créé
    Résultats 989 a été créé
    Résultats 992 a été créé
    Résultats 993 a été créé
    Résultats 1003 a été créé
    Résultats 1001 a été créé
    Résultats 999 a été créé
    Résultats 998 a été créé
    Résultats 1004 a été créé
    Résultats 1002 a été créé
    Résultats 1007 a été créé
    Résultats 986 a été créé
    Résultats 1020 a été créé
    Résultats 1011 a été créé
    ...
    Quand je regarde les nouveaux objets enregistrés dans ma collection MongoDB, ils sont aussi dans le désordre, donc ce n'est pas un problème de timing à cause du console.log() en local qui ne parviendrait pas à suivre l'enregistrement dans MongoDB.

    Pour résoudre ce problème et mettre mes objets dans le bon ordre j'ai essayé d'utiliser la logique async/await pour attendre que la méthode save() soit exécutée avant de sauvegarder l'objet suivant, c'est ce que j'ai fait dans le code ci-dessus. Mais le problème est resté le même.

    J'ai aussi essayé de mettre un setTimeOut() dans ma boucle for pour attendre deux secondes entre chaque enregistrement d'objet, c'est le code suivant mais le problème est resté le même.

    Code JavaScript : 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
    db.mongoose
      .connect(process.env.MONGODB_URI, {
        useNewUrlParser : true,
        useUnifiedTopology : true
      })
      .then((client) => {
        console.log("Connexion réussie à MongoDB.") ;
        addResultToCollection() ;
      })
      .catch(err => {
        console.error("Erreur de connexion", err) ;
        process.exit() ;
      }) ;
     
    function addResultToCollection() {
      Result.estimatedDocumentCount(async (err, count) => {
        if (!err && count === 0) {
          for (let i = 0 ; i < data.length ; i++) {
            setTimeout(() => {
              new Result({
                numero : data[i].numero,
                annee : data[i].annee,
                date : data[i].date,
                premier_cas : data[i].premier_cas
              }).save(err => {
                if (err) {
                  console.log("error", err) ;
                }
                console.log("Résultats %d a été créé", i) ;
              }) ;
            }, "2000")
          }
        } else if (count !== 0) {
          console.log("Les résultats ont déjà été créés !") ;
        }
      }) ;
    }

    Si quelqu'un sait comment résoudre ce problème et faire en sorte que les objets du tableau soient enregistrés dans le bon ordre dans ma collection sur MongoDB ça m'aiderait beaucoup.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2022
    Messages : 21
    Points : 28
    Points
    28
    Par défaut
    J'ai trouvé mon problème, je n'utilisais pas la bonne méthode de mongoose. save() permet de sauvegarder un document et insertMany() permet d'en sauvegarder plusieurs.

    Le code qui marche :
    Code JavaScript : 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
    const db = require("./models");
    const Role = db.role;
    const Result = db.result;
    db.mongoose
      .connect(process.env.MONGODB_URI, {
        useNewUrlParser: true,
        useUnifiedTopology: true
      })
      .then((client) => {
        console.log("Successfully connect to MongoDB.");
        addResultToCollection();
      })
      .catch(err => {
        console.error("Connection error", err);
        process.exit();
      });
     
    function addResultToCollection() {
      Result.estimatedDocumentCount(async (err, count) => {
        if (!err && count === 0) {
          Result.insertMany(data)
            .then(function () {
              console.log("Data inserted")
            }).catch(function (error) {
              console.log(error)
            });
        } else if (count !== 0) {
          console.log("Results have already been created!");
        }
      });
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parse JSON et enregistrer dans variables
    Par incent_bzh dans le forum Langage
    Réponses: 6
    Dernier message: 13/04/2016, 11h44
  2. Enregistrements dans le désordre
    Par BraDim dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 04/06/2009, 20h15
  3. Réponses: 11
    Dernier message: 23/09/2008, 13h16
  4. Réponses: 18
    Dernier message: 17/01/2007, 12h49
  5. Réponses: 5
    Dernier message: 30/07/2006, 17h49

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