没有数组的猫鼬模型保存
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();
})
我仍在努力摆脱 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();
})