2017-09-04 4 views
0

シード関数は、traits配列内に重複エントリを作成しています。save()の後にネストされたオブジェクトモデルを持つシードエントリが重複します

var seedGenres =() => { 
 
    seedData.genres.forEach((seed) => { 
 
    Genre.create({ 
 
     name: seed.name 
 
    }, (err, newGenre) => { 
 
     if (err) { 
 
     console.log(err) 
 
     } else{ 
 
     console.log("Genre Created") 
 
     seed.traits.forEach((trait) => { 
 
      Trait.create({ 
 
      name: trait.name, 
 
      upvoteScore: 0, 
 
      downvoteScore: 0, 
 
      totalVotes: 0 
 
      }, (err, newTrait) => { 
 
      if (err) { 
 
       console.log(err, newTrait) 
 
      } else { 
 
       newGenre.traits.push(newTrait) 
 
       newGenre.save() 
 
       console.log(newGenre.traits) 
 
       console.log('Trait pushed succesffuly') 
 
      } 
 
      }) 
 
     }) 
 
     } 
 
    }) 
 
    }) 
 
}

Genre.model.js

const mongoose = require('mongoose') 
 

 
var genreSchema = new mongoose.Schema({ 
 
    name: String, 
 
    traits: [ 
 
    { 
 
     type: mongoose.Schema.Types.ObjectId, 
 
     ref: "Trait" 
 
    } 
 
    ] 
 
}) 
 

 
module.exports = mongoose.model("Genre", genreSchema)

Trait.model.js

const mongoose = require('mongoose') 
 

 
var traitSchema = new mongoose.Schema({ 
 
    name: String, 
 
    upvoteScore: Number, 
 
    downvoteScore: Number, 
 
    totalVotes: Number 
 
}) 
 

 
module.exports = mongoose.model("Trait", traitSchema)

基本的には、それぞれに3つの特性を持つジャンルを配したいと思っています。コンソールのログには正しいと思われます。それが動作して完了だ後にコレクションを表示するときただし、6つの形質エントリは、各ジャンルの下にあります(二重の私たちが期待している)

これは、我々が

{ 「_id」を期待しているものです:のObjectId( "59ad8a73fa7058a4dc9c4971")、 "名前": "RPG"、 "形質":[ のObjectId( "59ad8a73fa7058a4dc9c4974")、 のObjectId( "59ad8a73fa7058a4dc9c4975")、 のObjectId( "59ad8a73fa7058a4dc9c4973") ]、 "__v" :3 }

これは現在取得中の出力です。

{ "_id":のObjectId( "59ad8a73fa7058a4dc9c4971")、 "名前": "RPG"、 "形質":[ のObjectId( "59ad8a73fa7058a4dc9c4974")、 のObjectId( "59ad8a73fa7058a4dc9c4974")、 のObjectId ( "59ad8a73fa7058a4dc9c4975")、 のObjectId( "59ad8a73fa7058a4dc9c4974")、 のObjectId( "59ad8a73fa7058a4dc9c4975")、 のObjectId( "59ad8a73fa7058a4dc9c4973") ]、 "__v":3 }

答えて

0

私の賭けはあなたになります同期ミキシングfor非同期マングース操作のループ。

私の最初の提案は、pushaddToSet()に変更することです。

私の2番目の提案はasync.jsです。

async.mapSeries(seedData.genres, (seed, cb1) => { 
    Genre.create({ name: seed.name }, (err, newGenre) => { 
     // stop mapSeries() if an error occurs 
     if (err) return cb1(err); 

     console.log("Genre Created") 

     // create traits 
     async.eachSeries(seed.traits, (trait, cb2) => { 
      Trait.create({ name: trait.name, upvoteScore: 0, downvoteScore: 0, totalVotes: 0 }, (err, newTrait) => { 
       // stop eachSeries() if an error occurs 
       if (err) return cb2(err); 

       console.log("Trait Created") 

       // add trait to genre 
       newGenre.traits.push(newTrait); 
       // mark current async task as done 
       cb2(); 
      }); 
     }, err => { 
      // if an error occurred during eachSeries() 
      if (err) return cb1(err); 
      // otherwise, save the genre 
      newGenre.save(cb1); 
     }); 
    }) 
}, (err, genres) => { 
    // if an error occurred during the operations, it will come here 
    if (err) { 
     console.log(err); 
     return; 
    } 
    console.log('DONE!', genres); 
}); 
+0

ねえ、返事に感謝 - 私は実際に 'addToSet'を使用して' push'を変更していたし、それがdupesのために働くように見えました。今では、すべてのユーザー(ゲーム、ジャンル、特性)を播種するときに、ジャンルの1つに3つの特性のうち2つしか得られません...私は同期vs.非同期のループに関するあなたの提案を掘り下げます - ありがとう! –

関連する問題