2016-09-28 75 views
0

我仍然試圖擺脫SQL模式,這可能是這是一個架構問題而不是實現的原因,但我不能爲我的生活弄清楚如何完成我想要達到的功能。Mongoose模型不保存數組

我有一個架構,爲用戶。它可以毫無麻煩地將用戶用mongoose保存到mongoDB中。它包含沿用戶名,密碼等行的通用東西。

然而,我們有一個新的屬性進入到模式模型,這被稱爲成就,並且是來自另一個模式的成就數組。它在用戶模式中聲明如下:

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

在UserSchema.save,我找了成果模型得到的匹配相同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正確的類型?

編輯:我確定有結果,因爲當我控制檯登錄他們,我可以看到他們在foreach裏面。

+0

你可以在這裏放置「achievementForGroupArray」對象嗎? –

回答

1

你被困在異步行爲中。把你的newUser.save方法放在「then block」裏(在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

乾杯fam - 排序。 – Aleski