简体   繁体   English

Mongoose - 获取和删除子记录

[英]Mongoose - Get and Delete a subrecord

I have a model defined as so:我有一个 model 定义如下:

const mongoose = require('mongoose');

const Schema = mongoose.Schema;

const feedbackSchema = new Schema({
  Name: {
    type: String,
    required: true,
  },
  Email: {
    type: String,
    required: true,
  },
  Project: {
    type: String,
    required: true,
  },
  Wonder: {
    type: String,
    required: true,
  },
  Share: {
    type: String,
    required: true,
  },
  Delight: {
    type: String,
    required: true,
  },
  Suggestions: {
    type: String,
    required: true,
  },
  Rating: {
    type: String,
    required: true,
  },
  dateCreated: {
    type: Date,
    default: Date.now(),
  },
  user: {
    type: Schema.Types.ObjectId,
    ref: 'User'
  }

});

const UserSchema = new Schema({
  googleId: {
    type: String
  },
  displayName: {
    type: String
  },
  firstName: {
    type: String
  },
  lastName: {
    type: String
  },
  image: {
    type: String
  },
  createdAt: {
    type: Date,
    default: Date.now(),
  },

  feedback: [feedbackSchema],
})

module.exports = mongoose.model("User", UserSchema);

An example document:示例文档:

{
    _id: ObjectId('60b9dc728a516a4669b40dbc'),
    createdAt: ISODate('2021-06-04T07:42:01.992Z'),
    googleId: '2342987239823908423492837',
    displayName: 'User Name',
    firstName: 'User',
    lastName: 'Name',
    image: 'https://lh3.googleusercontent.com/a-/89wf323wefiuhh3f9hwerfiu23f29h34f',
    feedback: [
        {
            dateCreated: ISODate('2021-06-04T07:42:01.988Z'),
            _id: ObjectId('60b9dc858a516a4669b40dbd'),
            Name: 'Joe Bloggs',
            Email: 'joe@bloggs.com',
            Project: 'Some Project',
            Suggestions: 'Here are some suggestions',
            Rating: '10'
        },
        {
            dateCreated: ISODate('2021-06-04T08:06:44.625Z'),
            _id: ObjectId('60b9df29641ab05db7aa2264'),
            Name: 'Mr Bungle',
            Email: 'mr@bungle',
            Project: 'The Bungle Project',
            Suggestions: 'Wharghable',
            Rating: '8'
        },
        {
            dateCreated: ISODate('2021-06-04T08:08:30.958Z'),
            _id: ObjectId('60b9df917e85eb6066049eed'),
            Name: 'Mike Patton',
            Email: 'mike@patton.com',
            Project: 'No More Faith',
            Suggestions: 'Find the faith',
            Rating: '10'
        },
    ],
    __v: 0
}

I have two routes defined, the first one is called when the user clicked a button on a feedback item on the UI which takes the user to a "are you sure you want to delete this record"-type page displaying some of the information from the selected feedback record.我定义了两条路由,当用户单击 UI 上的反馈项上的按钮时调用第一个路由,该按钮将用户带到“您确定要删除此记录”类型的页面,其中显示一些信息选择的反馈记录。

A second route which, when the user clicks 'confirm' the subrecord is deleted from the document.第二条路线,当用户单击“确认”时,子记录将从文档中删除。

The problem I'm having is I can't seem to pull the feedback from the user in order to select the document by id, here's what I have so far for the confirmation route:我遇到的问题是我似乎无法从用户那里获取反馈,以便通过 id 获取 select 文档,这是我迄今为止的确认路线:

router.get('/delete', ensureAuth, async (req, res) => {
    try {
        var url = require('url');
        var url_parts = url.parse(req.url, true);
        var feedbackId = url_parts.query.id;

        const allFeedback = await User.feedback;
        const feedbackToDelete = await allFeedback.find({ _id: feedbackId });

        console.log(feedbackToDelete);

        res.render('delete', {
            imgSrc: user.image,
            displayName: user.firstName,
            feedbackToDelete
        });
    } catch (error) {
        console.log(error);
    }
})

Help much appreciated非常感谢帮助

Update更新

You should be able to do just this:你应该能够做到这一点:

const feedbackToDelete = await User.feedback.find({ _id: feedbackId });

Or if feedbackId is just a string, which is appears to be, you may have to do something like:或者,如果feedbackId只是一个字符串,看起来是,您可能必须执行以下操作:

// Create an actual _id object
// That is why in your sample doc you see ObjectId('foobarbaz')
const feedbackId = new mongoose.Types.ObjectId(url_parts.query.id);
const feedbackToDelete = await User.feedback.find({ _id: feedbackId });

Original原来的

Shouldn't this:这不应该:

const allFeedback = await User.feedback; (a field) (一个领域)

be this:是这样的:

const allFeedback = await User.feedback(); (a method/function) (一种方法/功能)

? ?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM