2016-09-28 7 views
0

私はまだSQLモードから抜け出そうとしています。これは実装上の問題ではなくアーキテクチャ上の問題かもしれませんが、私が達成しようとしている機能を達成するために。モンゴースモデルは配列なしで保存されます

私はユーザーのためのスキーマを持っています。 mongooseを使用してユーザーをmongoDBに退避させます。

スキーマモデルに入力する新しいプロパティがありますが、これは成果と呼ばれ、別のスキーマの成果の配列です。次のようにこれは、ユーザーのスキーマで宣言されています。UserSchema.saveオン

var UserSchema = new Schema({ 
    _id    : { type: String, unique: true }, 
    group_id   : { type: String, required: true }, 
    username   : { type: String, required: true }, 
    achievements  : { type: Array } 
}); 

を次のように、私は、同じgroup_idと一致成果の配列を取得するために実績のモデルを探しています:

exports.create = function(req, res, next) { 
    var newUser = new User(req.body); 

    // Populate the achievements (same group_id) 
    Achievement.find() 
    .where({ group_id: newUser.group_id }) 
    .select({ _id: 1 }) 
    .exec() 
    .then(function(achievementsForGroupArray) { 

     _.forEach(achievementsForGroupArray, function(achievementForGroup) { 
     newUser.achievements.push(achievementForGroup); 
     }); 
    }) 
    .catch(function(err) { 
     return res.status(400).send(err).end(); 
    }) 

    newUser.save(function(err, user) { 
    // .. generic validation stuff .. 
    } 

上記のように、forEach()を返す配列のストレートプッシュに置き換えても機能せず、単純にプッシュすることでプッシュを置き換えることもできません。'test'はまだ入力されません。

保存する前にconsole.log newUserを入力すると、そこに保存されます。私がconsole.logにuserの部分にnewUser.save(function(err, user)の成果はありません。

私のスキーマ設定が間違っているので、Mongoose/MongoDBは正しいタイプではないため、matchが正しくタイプされていません。

EDIT:私はコンソールにログを記録するときに結果があると確信しています。私はforeach内でそれらを見ることができます。

+0

ここに「achievementsForGroupArray」オブジェクトを配置できますか? –

答えて

1

非同期動作が滞っています。 newUser.saveメソッドを「ブロック」内に配置します(forEachの後)

exports.create = function(req, res, next) { 
    var newUser = new User(req.body); 

    // Populate the achievements (same group_id) 
    Achievement.find() 
    .where({ group_id: newUser.group_id }) 
    .select({ _id: 1 }) 
    .exec() 
    .then(function(achievementsForGroupArray) { 

     _.forEach(achievementsForGroupArray, function(achievementForGroup) { 
     newUser.achievements.push(achievementForGroup); 
     }); 
**newUser.save(function(err, user) { 
    // .. generic validation stuff .. 
    })** 
    }) 
    .catch(function(err) { 
     return res.status(400).send(err).end(); 
    }) 
+0

ああ、本質的に '.then()'の中で終了する前に保存していますか? – Aleski

+0

右、それを非同期動作のためにまだ初期化していないときに.then()の外に保存しています。 – Sachin

+0

Cheers fam - ソート済みです。 – Aleski

関連する問題