2017-10-11 3 views
0

mongodbのコレクションにアイテムを追加しようとしています。mongodbコレクションにアイテムを追加するとforeachで約束事を管理する方法

これを解決するにはどうすればよいのですか?

putAlldata: function(items) { 
return new Promise(function(resolve, reject) { 
    MongoClient.connect(config.dbDelinquency.url, function(err, db) { 
    if (err) { 
     reject(err); 
    } else { 
     resolve(db); 
    } 
    }) 
}).then(function(db) { 
    return new Promise(function(resolve, reject) { 

    var collection = db.collection('data'); 

    items.forEach(function(item) { 
     //console.log(item); 
     db.collection('data').insert(item) 
    }) 
    resolve(items.length); 

    }); 
}); 

}

答えて

1

使用Promise.allとArray.map。私はasume db.collection.insertプロミスを返します。そうでない場合は教えてください。

.then(function(db) {  
    return Promise.all(items.map(function(item) { 
     return db.collection('data').insert(item) 
    })) 
    .then(() => items.length); 
    }); 
}); 
0

よりもむしろ項目の配列内の個々の項目について.insertをやって、あなたはhttp://mongodb.github.io/node-mongodb-native/2.2/api/Collection.html#insertMany(insertMany)を使用することができます。

MongoDBドライバは、コールバックが省略されたときにほとんどのメソッドの約束事を返します。したがって、あなた自身の約束を処理する必要はありません。

あなたはとして、すべてのコード例を書き換えることができます:あなたは本当に個別.insertを反復してやってみたかった場合、あなたは約束の配列を作成して待つようにPromise.allを使用することができ

return MongoClient.connect(url).then(db => db.collection('data').insertMany(items)); 

return Promise.all(items.map(item => db.collection('data').insert(item))); 
0

.insertまたは.insertManyで一括挿入できます。

return new Promise((resolve, reject) => { 
    const collection = db.collection('data'); 

    try { 
    const results = db.collection.insertMany(items); 
    return resolve(results); 
    } catch (error) { 
    return reject(error); 
    } 
} 

補足として...あなたが電話をしたいときはいつも、DB接続を作成するのは悪い習慣です。あなたがあなた自身の約束を解決することができますPromise.all.then

var promises = items.map(item => { 
    return db.collection('data').insert(item) 
}); 
Promise.all(promises).then(...etc 

0

は、あなたはそれはのようなものになるでしょうPromise.allと組み合わせて.mapを使用しています。

関連する問題