Функция поиска Mongoose для поиска не возвращает желаемых результатов

1

У меня есть список пользователей в Mongodb, который нужно искать в соответствии с некоторыми фильтрами, как показано на рисунке ниже: только пол является обязательным, и пользователи могут иметь или не иметь других деталей

    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 });
   });

Выше - запрос mongoose для поиска, и userEntry выглядит так

 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":""
}

Моя проблема - это функция поиска, она должна искать все записи с пол как "2" и возраст> = 28, а возраст = <40 (из приведенного выше запроса я получаю пустой массив, даже если одна запись удовлетворяет его), давая все результаты, которые удовлетворяют вышеуказанным условиям независимо от того, являются ли другие поля пустыми или не существуют. Любая помощь будет оценена по достоинству.

Как правильно предположил, изменил запрос, но все еще 0 записей

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);
});

});

одна из записей, пытающихся извлечь

{ "_id" : ObjectId("59c3f47e6388613b94556b78"), "name" : "tanzeel", "email" : "[email protected]", "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 } }
Теги:
mongoose

1 ответ

0
Лучший ответ

У вас есть правильное значение от MongoDB, но не ваше ожидаемое значение, потому что ваш запрос не корректен. Кроме того, $exist недействительный оператор должен быть $exists и вы сравниваете с пустой строкой для некоторых полей, таких как details.waist = "" потому что userEntry.weightLowerLimit пуст. Однако вы должны правильно строить запрос, чтобы получить ожидаемый результат. можно попробовать вот так...

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);
});
  • 0
    Я попробовал вышеуказанный ответ, однако теперь даже для пола = 2, получая 0 записей (редактировал вопрос)
  • 0
    Изменен query.details.waist для запроса ['details.waist'], чтобы он работал, спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню