Mongoose模型保存没有数组

时间:2016-09-28 10:37:00

标签: mongodb mongoose mongoose-schema

我仍然试图摆脱SQL模式,这可能是因为这是一个架构问题而不是实现问题,但我不能为我的生活找到如何完成功能我我想要达到。

我有一个架构,供用户使用。它使用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上,我正在查找Achievements模型,以获得与同一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'替换推送仍然不会填充它。

当我在保存之前调试.log newUser时,他们就在那里。当我在console.log中user newUser.save(function(err, user)部分时,没有任何成就。

我的架构设置是否正确,所以Mongoose / MongoDB只是放弃它,因为它没有match正确的类型?

编辑:我确信有结果,因为当我控制台登录时,我可以在foreach中看到它们。

1 个答案:

答案 0 :(得分: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();
    })