我仍然试图摆脱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中看到它们。
答案 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();
})