如何在MongoDB中使用动态变量更新含嵌套对象的文档
MongoDB动态更新嵌套字段的正确方法
你有如下结构的MongoDB文档:
{ ... "Lessons": [], "Students": { "Monday": {}, "Tuesday": {}, ... }, "CampYear": "aprs22" }
需求是将动态传入的姓名、时间数据插入到指定的日期对象(比如"Monday")中。例如传入参数"Monday"、"PHOEBE SMITH"、"1:00"和"2:00"后,文档应更新为:
{ ... "Lessons": [], "Students": { "Monday": { "PHEOBE SMITH": ["1:00", "2:00"] }, "Tuesday": {}, ... }, "CampYear": "aprs22" }
你尝试了以下代码但无法生效:
scheduleCamper(camper, time1, time2, day) { Programs.update({ _id: targetTeacherId }, { $set: { 'Students[day]': { camper: [time1, time2]}} }); }
问题原因与正确写法
你的代码存在两个核心问题:
- 动态字段路径写法错误:MongoDB不支持
[day]这种数组语法来引用动态键,需要用ES6模板字符串拼接合法的字段路径。 - 动态键名未正确解析:对象字面量中的
camper会被当作固定字符串键,而非变量值,需要用ES6计算属性名来处理。
基础覆盖式更新(替换已有用户的时间数组)
scheduleCamper(camper, time1, time2, day) { // 用模板字符串拼接完整的动态字段路径 const targetField = `Students.${day}.${camper}`; Programs.update( { _id: targetTeacherId }, { $set: { [targetField]: [time1, time2] } } ); }
可选:追加时间而非覆盖
如果需要给已有用户追加时间(而非替换原数组),可以用$push(允许重复)或$addToSet(去重):
// 追加时间(允许重复) scheduleCamper(camper, time1, time2, day) { const targetField = `Students.${day}.${camper}`; Programs.update( { _id: targetTeacherId }, { $push: { [targetField]: { $each: [time1, time2] } } } ); } // 追加不重复的时间 scheduleCamper(camper, time1, time2, day) { const targetField = `Students.${day}.${camper}`; Programs.update( { _id: targetTeacherId }, { $addToSet: { [targetField]: { $each: [time1, time2] } } } ); }
内容的提问来源于stack exchange,提问作者flimflam57
相关产品推荐
相关产品推荐

