How to delete an object from an array by its array ID in MongoDB?

Viewed 33

I'm building a small movie-reference database, and I would like to be able to delete an object from within an array.

For reference/background, I have this schema:

const movieSchema = new mongoose.Schema({
    title: {type: String, required: false},
    year: {type: String, required: false},
    image: {type: String, required: false},
    description: {type: String, required: false},
    plot: {type: String, required: false},
    references: [{title: String, reference: String, mediaType: String, timestampM: Number, timestampS: Number, description: String, relevance: String, refImg: String}]
})

My goal is to be able to delete the individual references within an array. I'm still learning so I'm at a bit of a loss. How should I have it set up? To edit/add references, I have my edit routes here:

app.get('/movies/:id/edit', (req, res) =>{
    Movie.findById(req.params.id, (err, foundMovie) =>{
        res.render('editMovie.ejs', {movies: foundMovie})
    })
})



app.put('/movies/:id',  (req, res) => {
    Movie.findByIdAndUpdate(
        req.params.id,
        {
        $push: {
            references: req.body,
        }
        
    },{new:true}, (err, foundMovie)=> {
        
        res.redirect('/movies')
    })
    console.log(req.params.id)
})

I've tried a few solutions, including the below, with no success.

<% 

for (let i= 0; i < movies.references.length; i++) {
    %>
    
    <ul id="refList"> 
        <li id="movieReference" class="refTitle"><%= movies.references[i].reference%></li>
        <li id="movieSource"><p id="category"> Source Media:</p><p id="catInfo"><%= movies.references[i].mediaType %></p></li>
        <li id="movieTimestamp"><p id="category">Timestamp:</p><%=movies.references[i].timestampM %> minutes, <%=movies.references[i].timestampS %> seconds. <br> <br></li>
        <li id="movieDescription"><p id="category">Description: </p><%=movies.references[i].description%><br><br></li>
        <li id="catImg"><img class="boxImg" src="<%=movies.references[i].refImg%>"></li>
        <li id="delete"><button onclick="Movie.update(
            { $pull: { references: { id: movies.references[i].id}}},
            false,
            true,
            ); ">Delete Reference</button></li>
    </ul>
    
    
<% } %>

What am I missing? I know I can easily create a Delete route that deletes the entire movie entry, but I am looking for a solution that simply deletes an array object by its ID.

1 Answers
Related