MERN堆栈,Mongodb使用该值更新所有嵌入的文档数组(如果它们具有特定值)



我正在尝试更新Many((文档,这是一个文档数组,如果它们有特定值的话。我仍在学习mongodb,我知道如何用我的新值更新所有具有此值的文档。我认为我遇到的问题是,它们是一系列文档,所以我需要进入每个文档,找到名为courses的字段,进入其中,找到名名为name的文档,然后更新name的值,我一直在尝试,但没有成功。此外,在请求中,我更新了第一个集合,没问题,当我进入下一个集合时,它不会像我已经提到的那样做任何事情。

request.body.code = request.sanitize(request.body.code);
request.body.name = request.sanitize(request.body.name);
request.body.courses.forEach(course => {
course.code = request.sanitize(course.code);
course.name = request.sanitize(course.name);
});
let newValues = { $set: {"code": request.body.code, "name":request.body.name } };
result = await mongoClient.db(DB_NAME).collection("all_courses").updateOne(selector, newValues);
// Okay now try to update other collection of array documents which isnt working yet
selector = { "code": "PROG2700"};
newValues = { $set: {"code": request.body.code, "name": request.body.name } };
console.log("this is new values");
console.log(request.body.courses);
result = await mongoClient.db(DB_NAME).collection("technologies").updateMany(selector,newValues);

这是在我的服务器中进行mongodb工作并尝试更新文档。

let sendString:Object = {
"id": my,
"code": edit_Course?.code,
"name": state_category_name,
"courses":
[   
{
"code": edit_Course?.code,
"name": state_category_name
}
]    
}

这就是我作为请求发送到服务器的内容。body

{
"_id": "5fdaa52060689aa159e4122e",
"name": "Webpack",
"description": "Webpack is great",
"difficulty": 2,
"courses": [
{
"code": "PROG2700",
"name": "Client Side Programming"
},
{
"code": "PROG3017",
"name": "Full Stack Programming"
}
]
}

这就是我在更新技术集合时遇到困难的每个文档的mongodb结构。这是我需要在课程下的每个文档中更新的名称字段。有人能帮我一把吗,非常感谢!

您的selector筛选器不适用于technologies类,因为匹配的code字段是名为courses的数组的一部分。为了说明这一点,过滤器应该看起来像这样:

{ "courses.code": "PROG2700" }

这是查询嵌入数组中的文档中的字段的示例。

下一步是更新数组中正确的文档。这可以在MongoDB中使用位置运算符$来完成。更新文档如下所示:

{ $set: { "courses.$.code": request.body.code, "courses.$.name": request.body.name }}

在这个更新文档中,位置运算符告诉MongoDB用PROG2700code更新courses数组中第一个文档的codename字段。

总之,更新可能看起来像这样:

filter = { "courses.code": "PROG2700" };
update = { $set: { "courses.$.code": request.body.code, "courses.$.name": request.body.name }};
result = await mongoClient.db(DB_NAME).collection("technologies").updateMany(filter,update);

最新更新