我有两个模型,Post
和Comment
:
我的Post
模型(models/post.js
):
var mongoose = require('mongoose');
var Comment = require('../models/comment');
var Schema = mongoose.Schema;
module.exports = mongoose.model('Post', new Schema({
text: {type: String, trim: true},
postedBy: String,
comments: [Comment]
}));
我的Comment
模型(models/comment.js
):
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
module.exports = mongoose.model('Comment', new Schema({
user: String,
comment: {type: String, trim: true},
created: {type: Date, default: Date.now(), select: false}
}));
当我尝试创建一个没有任何comments
的新帖子时,帖子创建得非常好。
虽然我在创作后尝试$push
对帖子发表评论,但没有任何反应。
Post.findOneAndUpdate(
{"_id": req.params.id},
{$push: {comments: {
comment: "Hello World",
user: "933ujrfn393r"
}}
}).exec(function(err, post) {
console.log(post);
res.json({success: true});
});
为什么没有将评论推到帖子上?我的console.log(post)
行只记录undefined
,因此不太清楚这里发生了什么。我尝试了Post.findOne({"_id": req.params.id})
的简单测试,并成功返回了帖子,因此查询查询没有问题。
答案 0 :(得分:6)
您的使用意味着模型中嵌入了sub document,只需要子文档的schema定义。这将把两个模式存储在MongoDB中单个集合中的单个文档中
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var CommentSchema = new Schema({
user: String,
comment: {type: String, trim: true},
created: {type: Date, default: Date.now(), select: false}
});
var PostSchema = new Schema({
text: {type: String, trim: true},
postedBy: String,
comments: [CommentSchema]
});
module.exports = mongoose.model('Post', PostSchema);
然后按原样创建评论。
Post.findOneAndUpdate(
{"_id": req.params.id},
{$push: {comments: {
comment: "Hello World",
user: "933ujrfn393r"
}}
}).then(function (post) {
console.log(post);
res.json({success: true});
});
如果您想保留这两个模型,则需要在Post
模式中使用引用。这将在MongoDB中的单独集合中创建单独的文档,并使用_id
查找第二个文档。
var PostSchema = new Schema({
text: {type: String, trim: true},
postedBy: String,
comments: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Comment'
}
});
然后需要先创建注释,然后才能在Post
模型中引用它们。
c = new Comment({ comment: 'x' })
c.save().then(function (result) {
return Post.findOneAndUpdate(
{ _id: req.params.id },
{ $push: { comments: result._id } }
);
}).then(function (result) {
console.log('updated post');
});
Population可用于轻松检索"外来"文档。
答案 1 :(得分:0)
基于this question,我认为您的问题是您嵌入了Comment
模型而不是Comment
模式
尝试更改post.js
:
var Comment = require('../models/comment');
为:
var Comment = require('../models/comment').schema;
在查看关于子文档的Mongoose docs示例后,这也很有意义。
P.S。
帮我调查的是输出err
回调的exec
对象,看看实际发生了什么......