【问题标题】:Update using positional operator ($) in mongoose在 mongoose 中使用位置运算符 ($) 进行更新
【发布时间】:2021-06-24 07:45:07
【问题描述】:

我有一个包含对象数组的文档。我想更新数组中的特定元素。尝试使用 MongoDB shell,它工作正常。但是当我在 NodeJs 中的 Mongoose 中使用时,它不起作用。两种情况下的命令都是一样的。

NodeJs 代码

 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
  }

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

【问题讨论】:

  • 更新部分有错字:'studentAtendance'。

标签: mongodb mongoose


【解决方案1】:

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

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

【讨论】:

  • 我做了,但仍然是同样的问题。我已将架构定义更新为问题的更新。
猜你喜欢
  • 2022-01-24
  • 2011-09-06
  • 2011-09-10
  • 2015-03-25
  • 2022-11-04
  • 2016-03-14
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多