猫鼬使用方法将模式添加到模式中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了猫鼬使用方法将模式添加到模式中相关的知识,希望对你有一定的参考价值。

[我正在尝试通过Mongo DB建立一个使用Node.js作为服务器端语言的博客。

因此,在我的博客中,人们可以像其他博客一样写帖子并在帖子中添加评论。

每个帖子都会有评论,这就是我正在尝试的帖子架构。当有人尝试在帖子上写评论时,它将向服务器发送POST请求,创建一个新评论并将其保存到数据库中。

在测试时,注释本身已正确保存,但是将其附加到发布模式时遇到了麻烦。

这是我的postSchema.js:

const mongoose = require("mongoose");

const postSchema = new mongoose.Schema(
  {
    owner: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "User",
      required: true
    },
    title: {
      type: String,
      required: true
    },
    body: {
      type: String,
      required: true
    },
    comments: [
      {
        comment: {
          type: mongoose.Schema.Types.ObjectId,
          ref: "Comment"
        }
      }
    ]
  }
);

还有我的commentSchema.js:

const mongoose = require("mongoose");

const commentSchema = new mongoose.Schema(
  {
    owner: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "User",
      required: true
    },
    post: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Post",
      required: true
    },
    content: {
      type: String,
      required: true
    }
  }
);

module.exports = Comment = mongoose.model("Comment", commentSchema);

因此,发布架构具有注释数组,用于在其中存储注释。用户每次添加评论时,都会创建一个POST请求:

router.post("/:id/new_comment", async (req, res) => {
  const { content } = req.body;
  const comment = new Comment({
    content,
    owner: req.user._id,
    post: req.params.id
  });
  try {
    const post = await Post.findOne({ _id: req.params.id });
    await comment.save();
    await post.addComment(comment);
    res.status(201).send({ post, comment });
  } catch (error) {
    res.status(500).send({ error: error.message });
  }
});

因此,此POST请求将查找用于添加评论的帖子,保存评论,并调用addComment()将评论连接到帖子的评论数组中。在此创建的注释将用作addComment()函数的参数。

并且addComment()函数位于PostSchema.js文件中,它是:

postSchema.methods.addComment = async function(comment) {
  const post = this;
  post.comments = post.comments.concat({ comment });
  await post.save();
  return post;
};

一切正常,但结果与我预期的不同。我希望它像

{
    "post": {
        "_id": "5e2e94c9e6ef8100ecfaf665",
        "title": "Test Post",
        "body": "Test Body",
        "owner": "5e2e6bbd18929829e8679cec",
        "comments": [
            {
                "_id": "5e2e98d9587c78444cd600b2",
                "comment": {
                    "_id": "5e2e98d9587c78444cd600b1",
                    "content": "Test Comment",
                    "owner": "5e2e6bbd18929829e8679cec",
                    "post": "5e2e94c9e6ef8100ecfaf665",
                    "__v": 0
                }
            }
        ],
    },
    "comment": {
        "_id": "5e2e98d9587c78444cd600b1",
        "content": "Test Comment",
        "owner": "5e2e6bbd18929829e8679cec",
        "post": "5e2e94c9e6ef8100ecfaf665",
        "__v": 0
    }
}

最初看起来不错,但是当我尝试保存第二条评论时出现了问题。保存的注释以某种方式更改,如下所示:

{
    "post": {
        "_id": "5e2e94c9e6ef8100ecfaf665",
        "title": "Test Post",
        "body": "Test Body",
        "owner": "5e2e6bbd18929829e8679cec",
        "comments": [
            {
                "_id": "5e2e98d9587c78444cd600b2",
                "comment": "5e2e98d9587c78444cd600b1"
            },
            {
                "_id": "5e2e98d9587c78444cd600b3",
                "comment": {
                    "_id": "5e2e98d9587c78444cd600b2",
                    "content": "Test Comment 2",
                    "owner": "5e2e6bbd18929829e8679cec",
                    "post": "5e2e94c9e6ef8100ecfaf665",
                    "__v": 0
                }
            }
        ],
    },
    "comment": {
        "_id": "5e2e98d9587c78444cd600b2",
        "content": "Test Comment 2",
        "owner": "5e2e6bbd18929829e8679cec",
        "post": "5e2e94c9e6ef8100ecfaf665",
        "createdAt": "2020-01-27T08:01:29.492Z",
        "updatedAt": "2020-01-27T08:01:29.492Z",
        "__v": 0
    }
}

当我创建测试评论2时,我保存的第一条评论发生了变化。可能是什么原因造成的?感谢您阅读这么长的问题。任何帮助将不胜感激!祝你有美好的一天。

答案

问题在这里,您是在传递完整的评论,而不是ID。

  await post.addComment(comment_id); // pass comment id here 

因为您的帖子模型

comments: [
      {
        comment: {
          type: mongoose.Schema.Types.ObjectId, // you are storing ObjectId here 
          ref: "Comment"
        }
      }
    ]

因此,您可以将评论存储为评论ID的数组,然后在要填充评论时获得完整的评论

以上是关于猫鼬使用方法将模式添加到模式中的主要内容,如果未能解决你的问题,请参考以下文章

将 created_at 和 updated_at 字段添加到猫鼬模式

MVVM 模式中代码隐藏的实用使用

用户模式中的数组 - 猫鼬

使用提交按钮/输入标签将数据插入猫鼬模式

Android当中的MVP模式终篇---关于对MVP模式中代码臃肿

Android当中的MVP模式终篇---关于对MVP模式中代码臃肿