Javascript 为什么我的猫鼬一对多关系不能正确关联?
有人知道为什么“用户”和“帖子”(用户可以有很多帖子)之间的一对多关系不起作用吗?看来我已经正确地设置了猫鼬关联,但是当创建一个新帖子时,它不仅没有分配给用户,而且用户本身也没有与任何帖子关联。我不确定我到底做错了什么 如果您看到下面的JSON对象,它应该有一个Javascript 为什么我的猫鼬一对多关系不能正确关联?,javascript,node.js,mongoose,one-to-many,mean-stack,Javascript,Node.js,Mongoose,One To Many,Mean Stack,有人知道为什么“用户”和“帖子”(用户可以有很多帖子)之间的一对多关系不起作用吗?看来我已经正确地设置了猫鼬关联,但是当创建一个新帖子时,它不仅没有分配给用户,而且用户本身也没有与任何帖子关联。我不确定我到底做错了什么 如果您看到下面的JSON对象,它应该有一个user值,表示创建帖子的用户。您将在下面的Post模型中看到,应该创建一个用户值,但不创建 我做错了什么 下面是创建新帖子后的JSON对象 问题:尽管在下面的Post模型中创建了user字段,但为什么上面的JSON中缺少该字段 以下是我
user
值,表示创建帖子的用户。您将在下面的Post模型中看到,应该创建一个用户值,但不创建
我做错了什么
下面是创建新帖子后的JSON对象
问题:尽管在下面的Post模型中创建了user字段,但为什么上面的JSON中缺少该字段
以下是我的帖子模型:
以下是我的用户模型:
以下是查询数据库的控制器:
注意:这是提交post表单时运行的方法
// Grab our Mongoose Models:
var User = require('mongoose').model('User');
var Post = require('mongoose').model('Post');
module.exports = {
// Creates a new post for logged in user:
newPost: function(req, res) {
Post.create(req.body)
.then(function(newPost) {
return res.json(newPost);
})
.catch(function(err) {
return res.json(err);
})
}
};
是否有人知道我的关联设置不正确,这就是为什么我没有在他们各自的字段中显示任何实际的帖子或用户
我的服务器端控制器似乎启动正常,因为post实际上已经创建。但是这些协会本身并没有联系起来,我也不确定我做错了什么。我在下面添加了一个简单的答案,以跟进上面的例子。基本上,@cdbajorin是正确的,我心不在焉地认为有一些自动化正在进行,没有正确地按照猫鼬的命令来实现我想要的结果 我的问题的解决办法如下:
User.findById(req.session.userID)
.then(function(user) {
// call our instance method above:
user.addPost(newPost);
return res.json(newPost);
});
posts
属性更新为空数组,而不是mongoose.Schema.Types.ObjectID
,因为这里没有存储对象ID,我误解了它的工作原理posts: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Post'
}],
相反,应该简单地写下:
posts: [],
newPost
方法应修改如下(有关说明,请参阅注释内联):
posts
数组(从UsersSchema
)的问题
虽然最初发布的问题已经解决,但人们可能会质疑这是否是数据库管理的最佳用途。如本例所示,在用户和帖子开始累积时,在用户内部存储帖子可能会占用大量空间
这篇文章在数据库中被复制了两次:首先,作为posts
集合中的文档本身,其次,作为UserSchema
中posts
数组中的对象
更好的解决方案是在posts
集合中将post作为唯一文档保存,但将会话信息中的userID添加到其中。然后,如果出于任何原因需要用户的所有帖子,则基于userID对posts集合的查询将返回分配了该userID的所有帖子。然后,数据库中只存在一个post副本,而不是两个
**附加说明:修改现有文档的另一种方法是使用实例方法,其中实际方法将插入到用户模型(架构)文件中,并在需要时调用:
UserSchema.methods.addPost = function(post) {
this.posts.push(post);
this.save();
return true;
};
例如,在上面的UserSchema
模型中的模块.exports
行之前插入以下代码,以便在需要时方便地访问此功能:
UserSchema.methods.addPost = function(post) {
this.posts.push(post);
this.save();
return true;
};
要从服务器控制器调用此实例方法,我们可以按如下方式重新编写控制器:
User.findById(req.session.userID)
.then(function(user) {
// call our instance method above:
user.addPost(newPost);
return res.json(newPost);
});
post将由实例方法推送和保存,该方法已内置到实例对象本身。您的
req.body
是什么?你是否认为当你创建一个帖子时,用户
应该自动更新?@cdbajorin你是100%正确的,我错误地认为mongoose会为我做一些关联,并且没有将我的新消息推送到我的User.posts中,为了更新post.user以反映用户ID,我几乎已经找到了一个解决方案,我将在完成后在这里发布我是如何计算出来的!感谢您抽出时间阅读!
UserSchema.methods.addPost = function(post) {
this.posts.push(post);
this.save();
return true;
};
User.findById(req.session.userID)
.then(function(user) {
// call our instance method above:
user.addPost(newPost);
return res.json(newPost);
});