Debug School

rakesh kumar
rakesh kumar

Posted on

How to update data in a collection in node js mongo db

Update data in a collection based on email and city
Use of Update Many

Update data in a collection based on email and city

Assuming you have a basic MVC structure with the following components:

Model (user.js):

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: String,
  email: String,
  city: String
});

module.exports = mongoose.model('User', userSchema);
Enter fullscreen mode Exit fullscreen mode

Controller (userController.js):

const User = require('../models/user');

const UserController = {
  updateUsers: async (req, res) => {
    try {
      const email = req.body.email; // Email obtained from req.body
      const city = req.body.city; // City obtained from req.body
      const updateFields = req.body.updateFields; // Fields to update obtained from req.body

      const filter = {
        email: email,
        city: city
      };

      await User.updateMany(filter, { $set: updateFields });

      res.send('Users updated successfully');
    } catch (error) {
      console.log('Error:', error);
      res.status(500).send('An error occurred');
    }
  }
};

module.exports = UserController;
Enter fullscreen mode Exit fullscreen mode

Route (routes.js):

const express = require('express');
const router = express.Router();

const UserController = require('../controllers/userController');

router.put('/users', UserController.updateUsers);

module.exports = router;
Enter fullscreen mode Exit fullscreen mode

In this example, the User model represents a user with name, email, and city fields.

The UserController contains a method named updateUsers, which takes the email from req.body.email, the city from req.body.city, and the fields to update from req.body.updateFields. It constructs a filter object that includes both the email and city fields. It then uses User.updateMany to update multiple documents that match the given filter with the specified update fields.

The route file defines a route that handles the PUT request to update multiple users. It maps the updateUsers method in the controller to the corresponding route.

To use this functionality, you would need to make a PUT request to the /users route, sending the email, city, and update fields in the request body. For example, using axios in a client-side JavaScript code:

axios.put('/users', {
  email: 'example@example.com', // Email to match
  city: 'New York', // City to match
  updateFields: { city: 'Los Angeles' } // Update the city field to 'Los Angeles'
})
  .then(response => {
    // Handle the response
  })
  .catch(error => {
    // Handle the error
  });
Enter fullscreen mode Exit fullscreen mode

This example demonstrates how you can update documents based on a dynamic query that includes both the email and city fields obtained from req.body in the context of the MVC

Image description

Image description

Image description

Image description

Use of Update Many

Assuming you have a basic MVC structure with the following components:

Model (user.js):

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: String,
  hobbies: [String]
});

module.exports = mongoose.model('User', userSchema);
Enter fullscreen mode Exit fullscreen mode

Controller (userController.js):

const User = require('../models/user');

const UserController = {
  updateUserHobbies: async (req, res) => {
    try {
      const filter = req.body.filter; // Filter criteria obtained from req.body
      const updateFields = req.body.updateFields; // Fields to update obtained from req.body

      await User.updateMany(filter, { $set: updateFields });

      res.send('Users updated successfully');
    } catch (error) {
      console.log('Error:', error);
      res.status(500).send('An error occurred');
    }
  }
};

module.exports = UserController;
Enter fullscreen mode Exit fullscreen mode

Route (routes.js):

const express = require('express');
const router = express.Router();

const UserController = require('../controllers/userController');

router.put('/users', UserController.updateUserHobbies);

module.exports = router;
Enter fullscreen mode Exit fullscreen mode

In this example, the User model represents a user with name and hobbies fields. The hobbies field is an array of strings.

The UserController contains a method named updateUserHobbies, which takes the filter criteria from req.body.filter and the fields to update from req.body.updateFields. It uses User.updateMany to update multiple documents that match the given filter criteria with the specified update fields.

The route file defines a route that handles the PUT request to update multiple users. It maps the updateUserHobbies method in the controller to the corresponding route.

To use this functionality, you would need to make a PUT request to the /users route, sending the filter criteria and update fields in the request body. For example, using axios in a client-side JavaScript code:

axios.put('/users', {
  filter: { name: 'John' }, // Filter users by name 'John'
  updateFields: { hobbies: ['Reading', 'Cooking'] } // Update the hobbies array to ['Reading', 'Cooking']
})
  .then(response => {
    // Handle the response
  })
  .catch(error => {
    // Handle the error
  });
Enter fullscreen mode Exit fullscreen mode

This example demonstrates how you can update an array field based on a dynamic query obtained from req.body in the context of the MVC pattern in Node.js and MongoDB. The controller handles the logic, the model represents the data structure, the route maps the request to the appropriate controller method

Top comments (0)