'Cannot push in mongodb

Im trying to create an API where users can create their fav movies and rate them. So instead of creating a Movies array in user model, I created a Movie model with userId as an array. Now the logic is if there is a movie by the same name the new user is trying to create, it will not create a movie, rather it will push the userid and their rating. If there is no movie by that name it will create one. But I am stuck in that part. Any help will be hugely appreciated. Below im posting my code.

Movie model

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

const movieSchema = new Schema({
    title: {
        type: String,
        required: true,
    },
    rating: [
        { type: Number, required: true, max: 5 },
    ],

    userId: [
        {
            type: String,
        },
    ],
});

const Movie = mongoose.model(
    'Movie',
    movieSchema
);
module.exports = Movie;

user model

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

const userSchema = new Schema({
    name: {
        type: String,
        required: true,
    },
    age: {
        type: Number,
        required: true,
    },
    // list: {
    //  type: Array,
    //  default: [],
    // },
});

const User = mongoose.model('User', userSchema);
module.exports = User;

movie route

const router = require('express').Router();
const User = require('../models/User');
const Movie = require('../models/Movies');

//creating a movie

router.post(
    '/:id/createmovie',
    async (req, res) => {
        const { title, rating } = req.body;
        const userId = req.params.id;
        try {
            const currentMovie = await Movie.findOne({
                title,
            });
            if (currentMovie == null) {
                const newMovie = new Movie({
                    title,
                    rating,
                    userId,
                });
                newMovie
                    .save()
                    .then((data) => res.json({ data }))
                    .catch((err) => {
                        res.status(400).json({ error: err });
                    });
            }
            currentMovie
                .updateOne(
                    { title },
                    { $push: { userId, rating } }
                )
                .then((data) => res.json({ data }))
                .catch((err) => {
                    res.status(400).json({ error: err });
                });
        } catch (err) {
            console.log(err);
        }
    }
);

// router.post('/:id/createmovie', (req, res) => {
//  const { title, rating } = req.body;
//  const userId = req.params.id;

//  Movie.findOne({ title }).then((data) => {
//      console.log(data);

//      res.json(data);
//      if (data == null) {
//          res.send('true');
//      }
//      res.send('false');

// if (data.title == title) {
//  Movie.updateOne(
//      { title },
//      { $push: { userId, rating } }
//  );
// }
// const newMovie = new Movie({
//  title,
//  rating,
//  userId,
// });
// newMovie
//  .save()
//  .then((data) => res.json({ data }))
//  .catch((err) => {
//      res.status(400).json({ error: err });
//  });
//  });
// });

router.get('/getmovie', (req, res) => {
    const { title } = req.body;
    Movie.find({ title })
        .then((data) => res.json(data[0].title))
        .catch((err) => {
            res.status(400).json({ error: err });
        });
});

module.exports = router;



Solution 1:[1]

Change router.post function arguments

router.post(
'/:id/createmovie',
async (req, res) => {
    const { title, rating } = req.body;
    const userId = req.params.id;
    try {
        const currentMovie = await Movie.findOne({
            title,
        });
        if (currentMovie == null) {
            
         await   Movie.insertOne({title ,rating, userId})
                .
        }
        else{
         await  Movie.updateOne(
                { title },
                { $push: { userId, rating } }
            )
            }
           
    } catch (err) {
        console.log(err);
    }
}
);

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 f?rat dede