没有数组的猫鼬模型保存

Mongoose model saves without array

我仍在努力摆脱 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' 仍然不会填充它。

当我console.lognewUser保存之前,他们都在里面。当我 console.log newUser.save(function(err, user)user 部分没有成就。

是不是我的架构设置不正确,所以 Mongoose/MongoDB 只是因为 match 类型不正确而将其删除?

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

您陷入了异步行为。将您的 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();
    })