mongoose "Find" with multiple conditions

Javascriptnode.jsMongodbMongoose

Javascript Problem Overview


I am trying to get data from my mongoDB database by using mongoose filters. The scenario is that each user object in the database has certain fields like "Region" or "Sector".

Currently I am getting all the users that contain the keyword "region" in there object like so:

 // Filter all healthcare bios by region
 app.get('/user',function(req, res) {

 // use mongoose to get all users in the database
 User.find({region: "NA"}, function(err, user) 
 {
	// if there is an error retrieving, send the error. nothing after res.send(err) will execute
	if (err)
	{
		res.send(err);
	}
	// return all todos in JSON format
	console.log(user);
	res.json(user);
	
});
});

How can put some conditions in mongoose that it return users that contain both "region" && "Sector" in their objects. Currently its only returning the user which have the region keyword in them.

I have tried using $and operator but I couldn't get it to work.

Javascript Solutions


Solution 1 - Javascript

app.get('/user',function(req, res) {

 User.find({region: "NA",sector:"Some Sector"}, function(err, user) 
 {
    if (err)
    {
        res.send(err);
    }
    console.log(user);
    res.json(user);

 });
});

If you want data with either region:"NA" or sector:"Some Sector". you can use $or operator.

User.find({$or:[{region: "NA"},{sector:"Some Sector"}]}, function(err, user) 
 {
    if (err)
    {
        res.send(err);
    }
    console.log(user);
    res.json(user);

 });

Solution 2 - Javascript

If you want results that contain any region or sector as long as both are present at the same time you need the following query in your User.find: {region: {$exists:true},sector: {$exists:true}}

, is the equivalent of $and as long as you are searching different fields.

Solution 3 - Javascript

  const dateBetweenDates = await Model.find({
    $or: [
      {
    $and: [
      { From: { $gte: DateFrom } },
      { To: { $lte: DateTo } },
    ],    // and operator body finishes
    },
      { _id: req.user.id},
    ], //Or operator body finishes
  })

Solution 4 - Javascript

For anyone else trying to find with multiple conditions using mongoose, here is the code using async/await.

app.get('/user', async (req, res) {

 const user = await User.find({region: "NA",sector:"Some Sector"});

 if (user) {
   // DO YOUR THING
 }

});

Solution 5 - Javascript

Multiple conditions

$lt selects the documents where the value of the field is less than (i.e. <) the specified value.

For most data types, comparison operators only perform comparisons on fields where the BSON type matches the query value's type. MongoDB supports limited cross-BSON comparison through Type Bracketing.

const users = await User.find({ region: "NA", age: { $lt: 30 } });

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSkywalkerView Question on Stackoverflow
Solution 1 - JavascriptVishnuView Answer on Stackoverflow
Solution 2 - JavascriptRon WertlenView Answer on Stackoverflow
Solution 3 - JavascriptQamar SandhuView Answer on Stackoverflow
Solution 4 - Javascriptbhavya_kariaView Answer on Stackoverflow
Solution 5 - JavascriptMD SHAYONView Answer on Stackoverflow