2016-09-28 67 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