meteor.js и mongoDB — запрос с несколькими полями

КОНТЕКСТ

Я пытаюсь создать функцию поиска, позволяющую пользователям заполнять несколько полей, отправлять и просматривать список совпадающих элементов из одной коллекции. Я делаю это с помощью формы на внешнем интерфейсе, которая обновляет переменные сеанса на бэкэнде, которые затем передаются как запрос в коллекцию mongodb.

КАК ЭТО ДОЛЖНО РАБОТАТЬ

Если пользователь указывает размер места, то отображаются места этого размера. Если вводится только местоположение, то отображаются места в пределах этого местоположения. Если указаны и размер, и местоположение, то отображаются места, соответствующие обоим критериям.

КАК ЭТО НА САМОМ ДЕЛЕ РАБОТАЕТ

Если ничего не заполнено, при нажатии на поиск будут показаны все элементы коллекции. Указав как местоположение, так и размер, вы получите места, соответствующие обоим критериям. Однако заполнение только одного поля и оставление другого пустым не дает никаких результатов. Мне интересно, почему это может быть - это почти так, как будто запрос ищет поле, которое буквально содержит ''... но тогда почему я не вижу этого поведения, когда оставляю оба поля пустыми? Помощь очень ценится!

ФРАГМЕНТ КОДА

//Search Form Helper
Template.managevenues.helpers({
  venue: function () {

    var venueNameVar = Session.get('venueNameVar');
    var venueLocationVar = Session.get('venueLocationVar');

    if(venueNameVar || venueLocationVar){
        console.log(venueNameVar);
        console.log(venueLocationVar);

        return Venues.find({
            venueName: venueNameVar,
            'venueAddress.neighbourhood': venueLocationVar
    });
    } else {
        return Venues.find({});
    }
});

person Sekoul    schedule 11.12.2015    source источник


Ответы (1)


Ответ кроется в вашем запросе

Venues.find({
        venueName: venueNameVar,
        'venueAddress.neighbourhood': venueLocationVar
});

Если у вас нет одного из ваших vars наборов, он будет выглядеть так...

{
   venueName: undefined,
   'venueAddress.neighbourhood':'someVal'
}

Так что это будет соответствовать любому заведению, у которого нет названия и которое находится в каком-то районе.

Лучшим подходом было бы устанавливать критерии запроса только в том случае, если есть значение для поиска...

var query = {};
if(Session.get('venueNameVar')) {
   query.venueName = Session.get('venueNameVar');
}
if(Session.get('venueLocationVar') {
   query.venueAddress = {
       neighbourhood : Session.get('venueLocationVar');
   }
}
return Venues.find(query);

Я думаю, что это будет работать немного лучше для вас!

person Shaded    schedule 11.12.2015