Home > Mobile >  Search an item with mongoose
Search an item with mongoose

Time:05-21

I want to search for a specific item from the database(mongodb) using mongoose ODM and display the item in my view. This is what I have found from the internet but its not working. Here is my controller:

exports.getSearch = (req, res, next) => { 
  const { name } = req.query;
  Product.find({title: { $regex: name, $options: "i" }})
    .then(title  => {
      res.render('shop/product-list', {
        prods:  title ,
        pageTitle: 'All Products',
        path: '/products'  
      });
    })
    .catch(err => {
      console.log(err);
    });
}

When I run my server I get this error after trying to search:

CastError: Cast to ObjectId failed for value "search" (type string) at path "_id" for model "Product"

Here is my search form:

<form action="/products" method="POST">
                    <input type="text" placeholder="search product" name="name">
                    <button type="submit">Search</button>
                </form>

Sample of the fields in my mongodb:

_id: 628398cb487a2cf1538c4087
title: "Dell  E7240"
price: 28600
description: "Dell Latitude E7240
Core i5 4th gen
12'
4GB RAM 
120GB SSD"
imageUrl: "images/2022-05-17T12:44:58.743Z-e7250.jpg"
userId: 627540c6672b6ab4007a3856
__v: 0

My product Schema:

const productSchema = new Schema({
  title: {
    type: String,
    required: true
  },
  price: {
    type: Number,
    required: true
  },
  description: {
    type: String,
    required: true
  },
  imageUrl: {
    type: String,
    required: true
  },
  userId: {
    type: Schema.Types.ObjectId,
    ref: 'User',
    required: true
  }
});

CodePudding user response:

use this

  exports.getSearch = (req, res, next) => { 
      const { title } = req.query;
      Product.find({title: { $regex: title, $options: "i" }})
        .then(prodName  => {
          res.render('shop/product-list', {
            prods:  prodName ,
            pageTitle: 'All Products',
            path: '/products'  
          });
        })
        .catch(err => {
          console.log(err);
        });
    }

CodePudding user response:

Because I was doing a post request and passing form data(title) to be filtered; I ought to have used req.body. This controller worked:

exports.getSearch = (req, res, next) => { 
    const title = req.body.title;
    Product.find({ title: { $regex: title, $options: "i" } })
        .then(title => {
            res.render('shop/index', {
            prods:  title ,
            pageTitle: 'All Products',
            path: '/products'  
            });
        })
        .catch(err => {
          console.log(err);
        });
    }
  • Related