首页 > 解决方案 > 在 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
  }

我做错了什么或问题出在哪里?

标签: mongodbmongoose

解决方案


不看架构定义,只是在黑暗中赌一把,你没有明确地说它是一个 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');

根据更新,您的更新语句需要“更新”。尝试在语句中修正studentAttendancevs的拼写。studentAtendance$set


推荐阅读