首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongoose删除数组中的SubDocument

Mongoose删除数组中的SubDocument
EN

Stack Overflow用户
提问于 2020-10-28 16:44:11
回答 2查看 66关注 0票数 0

我正在使用mongoose为我的项目制作数据库,我的模式Class的结构如下:

代码语言:javascript
复制
const mongoose = require('mongoose')

const classSchema = mongoose.Schema({
  _id: mongoose.Schema.Types.ObjectId,
  consultant: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Consultant',
    required: true
  },
  startYear: {
    type: String,
    required: true
  },
  classname: {
    type: String,
    required: true,
    unique: true
  },
  studentList: [
    {
      code: {
        type: String,
        required: true
      },
      fullname: {
        type: String,
        required: true
      }
    }
  ]
})

const Class = mongoose.model('Class', classSchema)

module.exports = Class

正如您所看到的,我有一个名为studentList的属性是一个数组,这就是它在mongoose Atlas中的存储方式

因此,现在我想删除数组studentList中的一个子文档,因此这是我的路线:

http://localhost:5000/users/:code

我是这样做的:

代码语言:javascript
复制
    exports.delele_student_from_user = (req, res, next) => {
      var { code } = req.params;
      var { classname } = req.body;
    
      User.findOneAndDelete({
        classname,
        studentList: {
          $pull: {
            code,
          },
        },
      })
        .exec()
        .then((doc) => {
          console.log(`deleted user with code ${code} from colection User`);
          next();
        })
        .catch((err) => {
          console.log(err);
          return res.status(500).json({ err });
        });
    };

我得到了这个错误:

代码语言:javascript
复制
{ MongoError: unknown operator: $pull
    at MessageStream.messageHandler (C:\Users\ASUS\OneDrive\Desktop\uet-backend\node_modules\mongoose\node_modules\mongodb\lib\cmap\connection.js:266:20)
    at MessageStream.emit (events.js:198:13)
    at processIncomingData (C:\Users\ASUS\OneDrive\Desktop\uet-backend\node_modules\mongoose\node_modules\mongodb\lib\cmap\message_stream.js:144:12)
    at MessageStream._write (C:\Users\ASUS\OneDrive\Desktop\uet-backend\node_modules\mongoose\node_modules\mongodb\lib\cmap\message_stream.js:42:5)
    at doWrite (_stream_writable.js:415:12)
    at writeOrBuffer (_stream_writable.js:399:5)
    at MessageStream.Writable.write (_stream_writable.js:299:11)
    at TLSSocket.ondata (_stream_readable.js:709:20)
    at TLSSocket.emit (events.js:198:13)
    at addChunk (_stream_readable.js:288:12)
    at readableAddChunk (_stream_readable.js:269:11)
    at TLSSocket.Readable.push (_stream_readable.js:224:10)
    at TLSWrap.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
  operationTime:
   Timestamp { _bsontype: 'Timestamp', low_: 3, high_: 1603874496 },
  ok: 0,
  code: 2,
  codeName: 'BadValue',
  '$clusterTime':
   { clusterTime:
      Timestamp { _bsontype: 'Timestamp', low_: 3, high_: 1603874496 },
     signature: { hash: [Binary], keyId: [Long] } },
  name: 'MongoError' }
DELETE /students/16022267 500 785.904 ms - 240

请告诉我如何解决这个问题,非常感谢您,祝您愉快

EN

回答 2

Stack Overflow用户

发布于 2020-10-28 16:56:47

使用findOneAndUpdate()\

您还可以直接在MongoDB中进行更新,而不必加载文档并使用代码对其进行修改。使用$pull或$pullAll运算符从数组中删除该项。

https://docs.mongodb.com/manual/reference/operator/update/pull/#up._S_pull

票数 0
EN

Stack Overflow用户

发布于 2020-10-28 16:57:51

您需要使用update

代码语言:javascript
复制
exports.delele_student_from_user = async (req, res, next) => {
  var { code } = req.params;
  var { classname } = req.body;
  try {
    await User.update(
      { classname },
      {
        $pull: {
          studentList: { code }
        }
      }
    );
    return res.status(200).json({ message: "Student deleted" });
  } catch (err) {
    return res.status(500).json({ err });
  }
};

我还使用了async / await,所以它看起来更干净。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64569238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档