Mongoose按id删除子文档方法

3

我有两个模型:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var ProjectSchema = new Schema({
  title: { type: String },
  images: [{
    type: Schema.Types.ObjectId,
    ref: 'Image'
  }]
});
module.exports = mongoose.model('Project', ProjectSchema);

并且

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var ImageSchema = new Schema({
  fileName: { type: String },
  fileSize: { type: Number }
});
module.exports = mongoose.model('Image', ImageSchema);

现有的项目中包含如下图像:

Project.findById(req.params.project_id, function(err, project) {
  if (err) { res.status(400).send(err); }

  var image = new Image({
    fileName: req.file.name,
    fileSize: req.file.size
  });

  image.save(function(err) {
    if (err) { res.status(400).send(err); }

    project.images.push(image);
    project.save();
  );
});

获取项目中的图像没有问题:

Project.findById(req.params.project_id)
  .populate('images')
  .exec(function(err, project) {
    if (err) { res.status(400).send(err); }

    res.status(200).json(project.images);
  });

我尝试使用Mongoose文档中的方法从一个故事中删除一张图片:

http://mongoosejs.com/docs/subdocs.html http://mongoosejs.com/docs/api.html#types_documentarray_MongooseDocumentArray.id
Project
  .findById(req.params.project_id)
  .populate('images')
  .exec(function(err, project) {
    if (err) { res.status(400).send(err); }

    project.images.id(req.params.image_id).remove();
    project.save();
  });

但是我一直在遇到错误:
/api-server/app/admin/images/index.js:170
          project.images.id(req.params.image_id).remove();
                         ^
TypeError: project.images.id is not a function

我在这里搜索解决方案,但只找到了2013年关于$pull的一些东西。.id()方法是否有问题,或者是我做错了什么。 由于我对mongoose相当新,有没有更好的方法来做到这一点?

2个回答

0

您只需要从数据库中删除该图像。希望以下代码能对您有所帮助。

Project
  .findById(req.params.project_id)
  .exec(function(err, project) {
    if (err) { res.status(400).send(err); }
    project.save();
    Image.remove({"_id":project.images._id},function(){})
  });

顺便提一下(无法在您已删除的问题中进行评论),Array.from具有内置的map方法,它是第二个参数。 - Nina Scholz

0

您可以使用findByIdAndUpdate$pull删除子文档。 将选项设置为{new: true}会覆盖现有文档。

var fieldsToRemove= {
      $pull: {
        images: {
          _id: req.params.type
        }
      }
    };

var options = { new: true };

    Project.findByIdAndUpdate(req.params.project_id, fieldsToRemove, options,
     function(err, project) {...

它将删除具有指定_id的子文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接