javascript - 无法更新 Mongoose 嵌套数组
问题描述
我花了一天时间浏览 Mongoose 文档和帖子,虽然我几乎可以肯定我拥有所有已解决帖子中规定的代码,但我根本无法让我的代码工作。:(
架构相对复杂,但绝不像我所看到的那样复杂:
const hrUserSchema = new mongoose.Schema({
username: String,
displayName: String,
school: String,
leaveAuthoriser: String,
holidayLeft: Number,
holidayAllowed: Number,
discretionaryDays: Number,
emailAddress: String,
termTimeOnly: Boolean,
noOfAdditionalContractedDays: Number,
noOfAdditionalContractedDaysLeft: Number,
teachingStaff: Boolean,
employStartDate: String,
notes: String,
loginAttempts: Number,
lineManages: [{
staffName: String
}],
bookedHoliday: [{
dateEntered: String,
startDate: String,
endDate: String,
daysTaken: Number,
status: String,
approvedBy: String,
leaveType: String,
declineReason: String
}],
additionalContractedDays: [{
acdDateEntered: String,
acdStartDate: String,
acdEndDate: String,
acdDaysTaken: Number,
acdStatus: String,
acdApprovedBy: String,
acdDeclineReason: String
}],
perfMan: [{
year: Number,
selfReview: {
sref1: String,
sref2: String,
sref3: String,
sref4: String,
sref5: String,
status: String,
dateStarted: String,
dateCompleted: String,
signedOff: Boolean
},
stage1: {
objectives : [
{
objective: String,
objectiveLinkToSchoolTeam: String,
objectiveProgress: Boolean
}
],
personalDevelopment: String,
resourcesTraining: String,
appraiserSignOff: Boolean,
appraiseeSignOff: Boolean
},
stage2: {
feedback: String,
appraiserSignOff: Boolean,
appraiseeSignOff: Boolean
},
stage3: {
feedback: String,
appraiserSignOff: Boolean,
appraiseeSignOff: Boolean
}
}]
});
基本上我想更新 perfMan.stage1.objectives.objectiveProgress,其中的数据示例如下:
"perfMan" : [
{
"_id" : ObjectId("60cb502631dcea3eaaae6853"),
"selfReview" : {
"sref1" : "I have no strength",
"sref2" : "No developments",
"sref3" : "None I'm brill",
"sref4" : "The department has no aims",
"signedOff" : true
},
"stage1" : {
"objectives" : [
{
"_id" : ObjectId("60cb502631dcea3eaaae6854"),
"objective" : "Objective is pants",
"objectiveLinkToSchoolTeam" : "I hate objectives!",
"objectiveProgress" : false
},
{
"_id" : ObjectId("60cb502631dcea3eaaae6855"),
"objective" : "My second Objectoves",
"objectiveLinkToSchoolTeam" : "My Second reasons",
"objectiveProgress" : false
}
],
"personalDevelopment" : "My personal Development",
"resourcesTraining" : "My Resources"
},
"stage2" : {
"feedback" : "Keep working HARD",
"appraiserSignOff" : true
},
"stage3" : {
"feedback" : "Yoy've done really well",
"appraiserSignOff" : true
},
"year" : NumberInt(2021)
}
]
我已经阅读并尝试通过使用 arrayFilters 来实现这一点,这对我来说似乎正是我想要的,我检查了我的 Mongoose 版本(托管),它是 4.4.6,所以我很容易在 3.6 以上运行,我认为是需要什么。
我当前的代码看起来像这样,我已经确认找到正确的数据:
HRUser.findOneAndUpdate(
{"username": username},
{"$set": {"perfMan.$[perfMan].stage1.objectives.$[objectives].objectiveProgress" : true}},
{"arrayFilters" : [{ "perfMan._id": ObjectId("" + perfmanID + "") },{ "objectives._id": ObjectId("" + objectiveID + "") }]}
),
function (err, response) {
console.log(err)
console.log(response);
if (!err) {
res.send("Successfully updated staff member details.");
} else {
res.send(err);
}
};
如果有人能发现我明显的错误,我将永远感激不尽!
谢谢
解决方案
在整个周末都没有看屏幕并第十亿次阅读文档之后,我决定改变策略!我看不到对 arrayFilters 数量的任何限制,或者在其中使用 objectID,我 99% 确定两个对象 ID 都是正确的,但是在将代码更改为下面的代码后,基本上使用了位置运算符 $ 基于相同的第一个 objectID 和一个 arrayFilter 元素的搜索,它现在正在工作!下面的代码:
HRUser.findOneAndUpdate({
perfMan: {
$elemMatch: {
_id: ObjectId("" + perfManID + "")
}
}
},
{"$set": {"perfMan.$.stage1.objectives.$[objectives].objectiveProgress" : false}},
{"arrayFilters" : [{ "objectives._id": ObjectId("" + objectiveID + "") }]},
function (err, response) {
console.log(err)
console.log(response);
});
推荐阅读
- clang - 如何使用 llvm-ar 生成的存档文件?
- node.js - Product.find({category: req.params.category}) 不起作用
- linux - Go 中的服务器没有监听 tun0
- java - Gson:跳过节点级别进行序列化
- python - python中SSL客户端的正确证书目的是什么?
- python - pycharm中可以使用manim吗?
- javascript - 使用 .sort() 排序的数组不等于手动排序的数组
- xamarin.forms - xamarin.forms 未显示 ToolbarItem
- angularjs - 切换按钮单击在angularjs中没有响应
- python - Pandas 将颜色填充到列标题或整个数据框