Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Why $or is not working properly in mongoose with regular expression

I’m trying to fetch documents which contain whatever I pass in url for filter which must present in title field or in tasks array of those documents:

example: localhost:4000/search?filter=Morning. here I’m looking for documents which contain Morning in their title or in their tasks.

But when I’m hitting the Api it is returning me all the documents.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

{
    "success": true,
    "message": "Successfully fetched todos",
    "filteredArray": [
        {
            "_id": "6386e34e2c65763cf25008f3",
            "toDoTitle": {
                "title": "Morning routines",
                "_id": "6386e34e2c65763cf25008f4",
                "createdAt": "2022-11-30T04:59:58.940Z",
                "updatedAt": "2022-11-30T04:59:58.940Z"
            },
            "toDoTasks": {
                "tasks": [
                    "code",
                    "sleep",
                    "code",
                    "eat",
                    "code"
                ],
                "_id": "6386e34e2c65763cf25008f5",
                "createdAt": "2022-11-30T04:59:58.941Z",
                "updatedAt": "2022-11-30T04:59:58.941Z"
            },
            "createdAt": "2022-11-30T04:59:58.941Z",
            "updatedAt": "2022-11-30T04:59:58.941Z",
            "__v": 0
        },
        {
            "_id": "6386e3552c65763cf25008f7",
            "toDoTitle": {
                "title": "Morning",
                "_id": "6386e3552c65763cf25008f8",
                "createdAt": "2022-11-30T05:00:05.813Z",
                "updatedAt": "2022-11-30T05:00:05.813Z"
            },
            "toDoTasks": {
                "tasks": [
                    "code",
                    "sleep",
                    "code",
                    "eat",
                    "code"
                ],
                "_id": "6386e3552c65763cf25008f9",
                "createdAt": "2022-11-30T05:00:05.813Z",
                "updatedAt": "2022-11-30T05:00:05.813Z"
            },
            "createdAt": "2022-11-30T05:00:05.813Z",
            "updatedAt": "2022-11-30T05:00:05.813Z",
            "__v": 0
        },
        {
            "_id": "6386e35f2c65763cf25008fb",
            "toDoTitle": {
                "title": "evening",
                "_id": "6386e35f2c65763cf25008fc",
                "createdAt": "2022-11-30T05:00:15.809Z",
                "updatedAt": "2022-11-30T05:00:15.809Z"
            },
            "toDoTasks": {
                "tasks": [
                    "code",
                    "sleep",
                    "code",
                    "eat",
                    "code"
                ],
                "_id": "6386e35f2c65763cf25008fd",
                "createdAt": "2022-11-30T05:00:15.809Z",
                "updatedAt": "2022-11-30T05:00:15.809Z"
            },
            "createdAt": "2022-11-30T05:00:15.810Z",
            "updatedAt": "2022-11-30T05:00:15.810Z",
            "__v": 0
        },
        {
            "_id": "6386e3672c65763cf25008ff",
            "toDoTitle": {
                "title": "evening",
                "_id": "6386e3672c65763cf2500900",
                "createdAt": "2022-11-30T05:00:23.977Z",
                "updatedAt": "2022-11-30T05:00:23.977Z"
            },
            "toDoTasks": {
                "tasks": [
                    "code"
                ],
                "_id": "6386e3672c65763cf2500901",
                "createdAt": "2022-11-30T05:00:23.977Z",
                "updatedAt": "2022-11-30T05:00:23.977Z"
            },
            "createdAt": "2022-11-30T05:00:23.977Z",
            "updatedAt": "2022-11-30T05:00:23.977Z",
            "__v": 0
        },
        {
            "_id": "6386e3712c65763cf2500903",
            "toDoTitle": {
                "title": "night",
                "_id": "6386e3712c65763cf2500904",
                "createdAt": "2022-11-30T05:00:33.286Z",
                "updatedAt": "2022-11-30T05:00:33.286Z"
            },
            "toDoTasks": {
                "tasks": [
                    "code"
                ],
                "_id": "6386e3712c65763cf2500905",
                "createdAt": "2022-11-30T05:00:33.286Z",
                "updatedAt": "2022-11-30T05:00:33.286Z"
            },
            "createdAt": "2022-11-30T05:00:33.287Z",
            "updatedAt": "2022-11-30T05:00:33.287Z",
            "__v": 0
        }
    ]
}

This is my model

const mongoose = require("mongoose");
const schema = mongoose.Schema;

const title = new schema(
    {
       title:{ 
        type: String,
        trim: true
        }

    },
    {
        timestamps: true 
    }

    );

const task = new schema(
    {
    tasks:[{ type: String,trim: true}]
    },
    {
    timestamps: true 
    }
    )   

const toDoSchema = new schema({
    toDoTitle : title,
    toDoTasks: task

    },
    {
    timestamps: true 
    });

const toDoModel = mongoose.model("toDo", toDoSchema);
module.exports = toDoModel;

this is my controller for filtering:

//importing model
const toDoModel = require('../models/ToDoModel');

//importing utils function
const toDosPerPage = require("../utlis/ToDosPerPage")

const searchController = async (req,res)=>{

    try{
        const {filter} = req.query
        if(!filter) throw new Error("Please provide Something in filter to search");
        const filteredArray = await toDoModel.find({
            $or:[{title:new RegExp(filter,'i')},{tasks: new RegExp(filter,'i')}]
        });

        
        
        res.status(200).json({
            success: true,
            message: "Successfully fetched todos",
            filteredArray

        });

        }
        catch(err){
            res.status(401).json({
                success: false,
                message: "Some error occuried",
                error: err.message
            })
            console.log(err.message);
        } 
    }
    module.exports = searchController;

I want it to return only those documents which contain morning in their title or in their tasks fields.

>Solution :

to find in embeded document use dot .

const filteredArray = await toDoModel.find({
   $or:[
        {'toDoTitle.title':new RegExp(filter,'i')},
        {'toDoTasks.tasks':new RegExp(filter,'i')}
   ]
});
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading