编辑特定集合数组的特定元素 - mongoDb

Editing specific element of an array of a particular collection - mongoDb

我是 mongoDb 的新手。我创建了一个名为 task 的集合,该集合具有 comments 字段,该字段与其他字段一起是数组。我需要编辑任务的特定评论。每个评论中都有一个编辑按钮。任务 ID 和评论 ID 都可用。现在如何编辑任务的具体评论?

提前致谢

任务api

{
   "status":true,
   "task":[
      {
         "_id":"61dfef323a6ee474c4eba926",
         "description":"hello there",
         "title":"hello",
         "comments":[
              {
                 "comment_id":1,
                 "username":"test",
                 "comment":"abcd",
                 "status":true,
              }, 
              {
                "comment_id":2,
                 "username":"test",
                 "comment":"abcdsdfsdf",
                 "status":true,
              }
           ],
         "createdAt":"2022-01-13T09:21:54.795Z",
         "updatedAt":"2022-01-13T09:21:54.795Z",
         "__v":0
      }
   ]
}

任务模型架构

const taskSchema = new Schema({
  title: { type: String, required: true },
  description: { type: String, required: true },
  comments: [Object],
}, {
  timestamps: true,
});

我尝试使用 $set 但我不知道如何在内部数组中使用它。

router.route('./comments/edit').post((req, res) => {
  const commentId = req.body.commentId;
  const taskId = req.body.postId;

  const comment = req.body.editedComment;
  const updatedAt = new Date();

  Task.updateOne(
    { _id: taskId},
    {
     //what to do here?
    //   $set: { comments: [ {'comment_id': commentId} ]},
    }
  )
    .then((response) => res.json({ status: true, msg: 'Comment Edited!' }))
    .catch(err => res.json({ status: false, msg: err }));
});

提前致谢。

这是最好的方法:

  db.collection.update({
  status: true
  },
  {
   $set: {
  "task.$[x].comments.$[y].username": "New Name"
 }
},
{
  arrayFilters: [
  {
    "x._id": "61dfef323a6ee474c4eba926"
   },
   {
    "y.comment_id": 2
   }
  ]
 })

解释:

  1. 在更新语句中将 x 和 y 定义为 arrayFIlters。
  2. 在 $set 语句中提供 x 和 y 过滤器以识别要更新的特定评论。

在示例中,我更新了用户名,但您可以更新 x 和 y 寻址的目标数组子元素中的任何其他值。

playground

here是如何在同一个嵌套数组元素中同时更新两个值。