如何使用Mongoose创建跟随模型的嵌入式文档?

时间:2016-05-31 05:31:59

标签: node.js mongodb mongoose

我有两个模型,PostComment

我的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})的简单测试,并成功返回了帖子,因此查询查询没有问题。

2 个答案:

答案 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对象,看看实际发生了什么......