简体   繁体   中英

Mongoose find function to search not returning desired results

I have a list of users in Mongodb that needs to searched according to some filters as shown in below picture: Only gender is mandatory and users may or may not have other details

    User.find({
     "gender": userEntry.gender,
     "dob": { $gte: convert.getDobFromAge(userEntry.ageHigherLimit), $lte: convert.getDobFromAge(userEntry.ageLowerLimit), $exist: false },
     "details.chest": { $gte: userEntry.chestLowerLimit, $lte: userEntry.chestHigherLimit, $exist: false },
     "details.waist": { $gte: userEntry.waistLowerLimit, $lte: userEntry.waistHigherLimit, $exist: false },
     "details.height": { $gte: userEntry.heightLowerLimit, $lte: userEntry.heightHigherLimit, $exist: false },
     "details.weight": { $gte: userEntry.weightLowerLimit, $lte: userEntry.weightHigherLimit, $exist: false }
   },   function (err, users) {
          return res.render('client/search.html', { users: users });
   });

Above is the mongoose query to search and the userEntry looks like this

 userEntry={
  "gender":2,
  "ageLowerLimit":28,"ageHigherLimit":40,
  "chestLowerLimit":"","chestHigherLimit":"",
  "heightLowerLimit":"","heightHigherLimit":"",
  "waistLowerLimit":"","waistHigherLimit":"",
  "weightLowerLimit":"","weightHigherLimit":"",
  "state":"","city":"",
  "country":"","skin_color":"",
  "profession_type":"","experience":"",
  "hair_type":""
}

My problem is the find function , it should search all records with gender as '2' and age>=28 and age=<40 (from the above query gives me empty array even though one record satisfies it),giving all the results that satisfy the above conditions irrespective of whether other fields are empty or doesnot exist. Any help would be appreciated.

As rightly suggested changed the query to but still 0 records fetched

var query = {
  details: {}
};
if (userEntry.gender) {
  query.gender = userEntry.gender;
}
if(userEntry.ageLowerLimit && userEntry.ageHigherLimit ) {
  query.dbo = { $gte: convert.getDobFromAge(userEntry.ageHigherLimit), $lte: convert.getDobFromAge(userEntry.ageLowerLimit)};
}
console.log(query);
User.find(query, function (err, users) {
  if(!err) {
    console.log(users);
    return res.render('client/search.html', { users: users });
  }
  console.log(err);
});

});

one of the records trying to fetch

{ "_id" : ObjectId("59c3f47e6388613b94556b78"), "name" : "tanzeel", "email" : "im_tanzeel@yahoo.co.in", "password" : "$2a$10$kvachEZL0vEPPJiS7bIAMeGMXiZ.MRaZmrBECXB207jme1I4JEn6i", "created_at" : ISODate("2017-09-21T17:18:54.822Z"), "role" : 1, "following" : [ ], "dp" : "/dp/default.jpg", "gender" : 2, "__v" : 0, "dob" : ISODate("1994-11-29T00:00:00Z"), "details" : {  "height" : 160, "weight" : 65, "profession_type" : "Actor", "skin_color" : "Tan", "eye_color" : "Black", "waist" : 32, "chest" : 35 } }

You got correct value from MongoDB but not your expected value because your query build not correct. Also $exist not valid operator should be $exists and you compare with empty string for some fields like details.waist = "" because userEntry.weightLowerLimit is empty. However you should build query correctly to get expected result. can try like this...

var query = {
  details: {}
};

if (userEntry.gender) {
  query.gender = userEntry.gender;
}
if(userEntry.ageLowerLimit && userEntry.ageHigherLimit ) {
  query.dbo = { $gte: convert.getDobFromAge(userEntry.ageHigherLimit), $lte: convert.getDobFromAge(userEntry.ageLowerLimit)};
}
if(userEntry.chestLowerLimit &&  userEntry.chestHigherLimit) {
  query['details.chest'] = { $gte: userEntry.chestLowerLimit, $lte: userEntry.chestHigherLimit };
}
//... for others conditions

User.find(query, function (err, users) {
  if(!err) {
    return res.render('client/search.html', { users: users });
  }
  console.log(err);
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM