mongodb - 在 mongoose 中使用位置运算符 ($) 进行更新
问题描述
我有一个包含对象数组的文档。我想更新数组中的特定元素。尝试使用 MongoDB shell,它工作正常。但是当我在 NodeJs 中的 Mongoose 中使用时,它不起作用。两种情况下的命令都是相同的。
Node.js 代码
const updateAttendance = await classModel.updateOne(
{
_id: item.classId,
'studentAttendance.studentId': item.studentId,
},
{ $set: { 'studentAtendance.$.present': true } }
)
模式定义
const mongoose = require('mongoose')
const moment = require('moment')
const student = mongoose.Schema({
studentId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
unique: true,
},
present: {
type: Boolean,
default: false,
},
})
const classes = mongoose.Schema({
date: {
type: String,
required: true,
default: moment().format('DD/MM/YYYY'),
validate: {
validator: (value) => {
return moment(value, 'DD/MM/YYYY', true).isValid()
},
message: 'Provide a valid date in the format of DD/MM/YYYY',
},
},
courseId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Course',
},
studentAttendance: [
{
type: student,
},
],
})
module.exports = mongoose.model('Class', classes)
样本数据
{
"date": "20/06/2021",
"_id": "60cf5446970dc063e40356d3",
"courseId": "60ce2c3aca275c868089ac48",
"studentAttendance": [
{
"present": false,
"_id": "60cf5446970dc063e40356d4",
"studentId": "60ce315f9f83a24544414705"
},
{
"present": false,
"_id": "60cf5446970dc063e40356d5",
"studentId": "60ce31ba9f83a2454441470a"
},
{
"present": false,
"_id": "60cf5446970dc063e40356d6",
"studentId": "60ce38e49f83a24544414712"
}
],
"__v": 0
}
我做错了什么或问题出在哪里?
解决方案
不看架构定义,只是在黑暗中赌一把,你没有明确地说它是一个 ObjectId。
轻松解决,只需将“item.studentId”包装在 mongoose.Types.ObjectId() 中。
所以你的新代码就像
const updateAttendance = await classModel.updateOne({
_id: mongoose.Types.ObjectId(item.classId),
'studentAttendance.studentId': mongoose.Types.ObjectId(item.studentId),
},
{ $set: { 'studentAtendance.$.present': true } }
)
不要忘记const mongoose = require('mongoose');
根据更新,您的更新语句需要“更新”。尝试在语句中修正studentAttendance
vs的拼写。studentAtendance
$set
推荐阅读
- javascript - 如何使用 Javascript 中的箭头键移动此对象?
- typescript - 错误 TS2688:找不到“koa”的类型定义文件。1 ///
- c++ - 对地图中的唯一值进行排序
> - regex - 正则表达式 - 如何从结果集中排除某些字符串?
- reactjs - Draft-js-export-html 导出时不包含视频
- java - 如何在运行时更新 pom 中的 maven 依赖项
- javascript - Google Script Editor Script 将昨天的电子邮件提升为前一天的电子邮件
- java - 如何使用功能接口/lambda 参数模拟 void 方法?
- node.js - 如何使用node js从数组中的body解析器获取数据?
- c++ - 如何获取cmake在android中生成.so或.a文件的路径?