coolhack7
coolhack7

Reputation: 1224

API for making query searches not working

I'm trying to fetch all records from MongoDB starting with the Alphabet S but every time I try doing so, it returns nothing but []. I'm using the Params tab on Postman to do this. The code that I have written is below as well as a snip from Postman to make the question more understandable. I'm pretty sure that the API I have written to perform this has something wrong with it.

The Model file

const mongoose = require('mongoose');

const entry = new mongoose.Schema({
    name : {
        type : String,
    },
    collegeName : {
        type : String,
    },
    location : {
        type : String,
    }
});

const enter = mongoose.model("Student", entry);
module.exports = enter;

index.js

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const mongo = require('mongodb');
const dataModel = require('./model/model');

const MongoClient = mongo.MongoClient;

const uri = "mongodb+srv://coolhack069:[email protected]/assignment?retryWrites=true&w=majority";
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });

app.use(express.json());

app.use(bodyParser.json());

const port = 3001;

app.get('/api/get', (req, res) => {
    client.connect(err => {
        if(err) {
            throw err;
        }
        const collection = client.db('assignment').collection('data');
        const fetchedData = {};
        collection.find(fetchedData).toArray(function(err, result) {
            res.send(result);
            client.close();
        });
    })
});

app.get('/api/getStudentDetails', (req, res) => {      //The API I have written to query through the Database
    client.connect(err => {
        if(err) {   
            throw err;
        }
        const collection = client.db('assignment').collection('data');
        const fetchedData = new dataModel({
            name : req.params.name
        });
        collection.find(fetchedData).toArray(function(err, result) {
            res.send(result);
            client.close();
        })
    })
});

app.post('/api/add', (req, res) => {            //To add Data
    const name = req.body.name;
    const collegeName = req.body.collegeName;
    const location = req.body.location;

    client.connect(err => {
        if(err) {
            throw err;
        }
        
            const collection = client.db('assignment').collection('data');
            const storeData = new dataModel({
                name : name,
                collegeName : collegeName,
                location : location
            });
            console.log(storeData);
            collection.insertOne(storeData, function(err, result) {
                res.json({
                    result : "Success"
                });
                console.log(err);
                client.close();
            });
        })
    });

    app.listen(port, () => {
        console.log(`Application running at http://localhost:${port}`)
    })

The Screenshot from Postman

enter image description here

Upvotes: 0

Views: 146

Answers (1)

hoangdv
hoangdv

Reputation: 16137

Your find condition is not correct:

        const fetchedData = new dataModel({ // ???
            name : req.params.name
        });
        collection.find(fetchedData).toArray(function(err, result) {
            res.send(result);
            client.close();
        })

??? - I guest your meaning is const fetchedData = { name: req.params.name}; - Find every document which have name is req.params.name (S - in your case). But there is no document has name is S in your collection, then it returns [].

If you want to find the documents with S as the first character of their name, you can use Regex syntax:

        const query = {
            name : new RegExp('^' + req.params.name, 'i'), // i - case insensitive, => /^S/i
        };
        collection.find(query).toArray(function(err, result) {
            res.send(result);
            client.close();
        })

Upvotes: 1

Related Questions