2016-05-08 16 views
0

db(mongo)からいくつかのデータを取得する次のコードがあります。アップデートされたモデルをmongodbに保存

function getAllUsers(){ 
    var UsersPromise = Q.defer(); 

    UserSchema.find({}, function(err, data){ 
     if(err){ 
      UsersPromise .reject(err); 
     }else { 
      UsersPromise .resolve(data); 
     } 
    }); 
    return UsersPromise .promise; 
} 

次に、これらのモデルをそれぞれ修正します。ユーザーのタイプに応じて、特定のフィールドをモデルに追加します。 (これは正しく動作しています)。

function buildUsers(users){ 
    // my code iterates over users and adds 
    // properties as required. 
    // Working fine. 
    return users; // updated users. 
} 

ここで、これらの更新されたモデルをmongoに保存したいと思います。これが私の髪を引っ張ってくれます。

function saveUsers(users){ 
    // here, the users are received correctly. But the following line to save the users fails. 
    var SaveUsersPromise = Q.defer(); 
    UserSchema.save(users, function(err, data){ 
     if(err){ 
      SaveUsersPromise .reject(err); 
     } else { 
      SaveUsersPromise .resolve(data); 
     } 
    }); 
    return SaveUsersPromise .promise; 
} 

最後に、私は次のようにこれらの関数を呼び出す:

DB.connect() 
.then(getAllUsers) 
.then(buildUsers) 
.then(saveUsers) 
.catch(errorHandler); 

すべては私がUserSchema.saveを呼び出す正しくそれまでは動作します。何が問題なの?

PS:私はmongooseを使用しています。

TIA。

答えて

1

UserSchema.saveは単一インスタンスを受け入れます。ユーザーをループしてそれぞれを保存する必要があります。モンゴースにはバルクインサートがまだ実装されていません(issue #723参照)。ここで

async.eachSeries

function saveUsers(users){ 
    var async = require('async'); // <== npm install async --save 
    var SaveUsersPromise = Q.defer(); 
    async.eachSeries(users, function(user, done){ 
     UserSchema.save(user, done); 
     // or 
     user.save(done); // if user is Mongoose-document object 
    }, function(err){ 
     if(err){ 
      SaveUsersPromise.reject(err); 
     } else { 
      SaveUsersPromise.resolve(); 
     } 
    }); 
    return SaveUsersPromise.promise; 
} 
+0

おかげメイトを使用して単純な実装です。それを見てあなたに知らせるでしょう。 :) – AdityaParab

+0

ありがとう!出来た。しかし、私は 'async.eachSeries'の代わりに' async.forEachOf'を使用しなければなりませんでした。再度、感謝します。 :) – AdityaParab

関連する問題