[英]Update multiple documents in MongoDB by altering object in array
我有一个简单的注册/登录应用程序,它基本上是一个Coursera / udemy类型,该应用程序列出了特定的课程,用户可以喜欢它们或注册他们。 我一直在尝试使用mongodb函数来更新数据库中的用户,并且由于用户可以喜欢课程,因此它也必须更新所有课程(课程具有“ usersLiked”字段,该字段是一个数组,并保留所有具有喜欢它)。
课程结构如下:
{
"_id" : ObjectId("5977662564aac9f6c8d48884"),
"title" : "Title",
"lecturer" : "Lecturer",
"length" : 30,
"coverPhoto" : "Photo",
"usersLiked": [
{
"_id" : ObjectId("597763e346a7a463cbb8f529"),
"fullname" : "Name",
"username" : "Username",
"password" : "Hash",
"city" : "City",
"street" : "Street",
"website" : "Website"
}
],
"lectures" : [
{
"title" : "Introduction",
"number" : 1,
"url" : "someURL"
}
]
}
和用户结构:
{
"_id" : ObjectId("597763e346a7a463cbb8f529"),
"fullname" : "Name",
"username" : "Username",
"password" : "Hash",
"enrolledCourses" : [
...
]
}
],
"city" : "City",
"street" : "Street",
"website" : "Website"
}
所以现在我要更改时调用此函数。 它更改了userCollection,但是在courseCollection中它什么也不做,尽管它应该获取所有课程,并且如果其中一些课程在“ usersLiked”数组中具有用户名(用户名)的对象,它也应该在那里修改用户。
const updateUser = (username, details) => {
usersCollection
.update({
username: username,
}, {
$set: {
fullname: details.fullname,
city: details.city,
street: details.street,
website: details.website,
},
});
coursesCollection
.updateMany(
{
usersLiked: {
$elemMatch: {
username: username,
},
},
},
{
$set: {
'usersLiked.username': details.username,
'usersLiked.city': details.city,
'usersLiked.street': details.street,
'usersLiked.website': details.website,
},
}
);
};
您在课程更新中的匹配看起来有效,但是您正在尝试将值设置为数组,并且根据Mongo文档,您需要提供数组索引器或位置运算符。
下面将允许set命令对usersLiked
数组中与给定username
匹配的第一个元素进行操作。
coursesCollection.updateMany(
{
usersLiked: {
$elemMatch: {
username: username,
},
},
},
{
$set: {
'usersLiked.$.username': details.username,
'usersLiked.$.city': details.city,
'usersLiked.$.street': details.street,
'usersLiked.$.website': details.website
},
}
)
您也可以在usersLiked
数组中选择要更新的元素,例如usersLiked.1.username
但我怀疑对于给定的username
,每门课程在usersLiked
只有一个元素,在这种情况下,使用$
运算符(这意味着:第一个匹配的数组元素)应该足够了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.