编辑特定集合数组的特定元素 - 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
}
]
})
解释:
- 在更新语句中将 x 和 y 定义为 arrayFIlters。
- 在 $set 语句中提供 x 和 y 过滤器以识别要更新的特定评论。
在示例中,我更新了用户名,但您可以更新 x 和 y 寻址的目标数组子元素中的任何其他值。
而here是如何在同一个嵌套数组元素中同时更新两个值。
我是 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
}
]
})
解释:
- 在更新语句中将 x 和 y 定义为 arrayFIlters。
- 在 $set 语句中提供 x 和 y 过滤器以识别要更新的特定评论。
在示例中,我更新了用户名,但您可以更新 x 和 y 寻址的目标数组子元素中的任何其他值。
而here是如何在同一个嵌套数组元素中同时更新两个值。