如何在 Mongoose 中增加子文档的属性?

Posted

技术标签:

【中文标题】如何在 Mongoose 中增加子文档的属性?【英文标题】:How do I increment a property of a subdocument in Mongoose? 【发布时间】:2018-05-23 21:48:22 【问题描述】:

我正在使用 Mongoose 在 NodeJS 中创建一个路由,它会增加对象子文档的评级。我将在下面发布模型和路线代码。当我在 Postman 中执行查询时,我得到一个空的 json 对象和一个 400 错误。这意味着在查询中的某个地方我做错了什么。

blogPost 模型

  const BlogPostSchema = new Schema(
  content: 
    type: String,
    validate: 
      validator: (content) => content.length > 5,
      message: 'Content must contain at least 6 characters.'
    ,
    required: [true, 'Content must be filled in.']
  ,
  rating: Number,
  title: String,
  user:  type: Schema.Types.ObjectId, ref: 'user' ,
  board: type: Schema.Types.ObjectId, ref: 'board',
  comments: [commentSchema]
);

const BlogPost = mongoose.model('blogPost', BlogPostSchema);

module.exports = BlogPost;

评论架构

const CommentSchema = new Schema(
  content: 
    type: String,
    validate: 
      validator: (content) => content.length > 5,
      message: 'Content must contain at least 6 characters.'
    ,
    required: [true, 'Content must be filled in.']
  ,
  user:  type: Schema.Types.ObjectId, ref: 'user' ,
  rating: Number
);

module.exports = CommentSchema;

NodeJS 路由

routes.put('/blogPosts/:id/comment/:idm', function(req, res) 
    const blogPostId = req.param('id');
    const commentId = req.param('idm');

    BlogPost.findById(blogPostId)
        .then((blogPost) => 
          blogPost.comments.findByIdAndUpdate(_id: commentId, $inc: rating: 1);
        )
        .then((blogPost) => res.status(200).json(
        'status': 'Comment rating is increased.'
    ))
    .catch((error) => res.status(400).json(error))
);

这是PostMan的回复

感谢所有帮助。

【问题讨论】:

findByIdAndUpdate() 方法似乎只需要第一个参数的 id,只是方法名称。你确定它不应该是blogPost.comments.findByIdAndUpdate(commentId, $inc: rating: 1);吗?或者,您可以改用findOneAndUpdate() 方法。文档似乎同意:mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate 几个问题/澄清: 1. req.params 而不是 req.param 2. blogPost.comments.findByIdAndUpdate 这是有效的吗?我猜是因为我以前从来没有这样工作过。 3. 正如 B. Fleming 所说,findByIdAndUpdateid 作为其第一个参数,您不需要将其作为查询放入。 【参考方案1】:

这是错误:

BlogPost.findById(blogPostId)
    .then((blogPost) => 
      blogPost.comments.findByIdAndUpdate(_id: commentId, $inc: rating: 1);
    )
    .then((blogPost) => res.status(200).json(
    'status': 'Comment rating is increased.'
))

应该是:

    BlogPost.update(_id: blogPostId, 'comments._id': commentId, $inc:'comments.$.rating':1)
    .then((blogPost) => res.status(200).json(
    'status': 'Comment rating is increased.'
))

【讨论】:

以上是关于如何在 Mongoose 中增加子文档的属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Mongoose 返回所有子文档

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?

创建后如何在 mongoose 中填充子文档?

Mongoose:如何将子文档中的数组提取到父文档中的单个数组中

如何查询和排序 Mongoose 子文档