2014-07-17 18 views
7

Buduję aplikację przy użyciu MongoDB, kątowej, ekspresowej i węzła (stos MEAN).Określanie parametrów kwerendy Mongo na kontrolerze klienta (MEAN.JS)

Do generowania aplikacji użyłem generatora MEAN.JS.

Będę używał modułu articles jako punktu odniesienia.

Załóżmy, że mam 7000 rekordów w kolekcji artykułów, a każdy rekord ma przypisaną datę. Nieefektywne jest ładowanie wszystkich 7000 rekordów do pamięci za każdym razem, gdy ładuję stronę, aby wyświetlić rekordy w tabeli i widzę z tego powodu straszne straty wydajności. Z tego powodu chciałbym załadować rekordy z datą w zakresie (1 miesiąc) do (1 rok od teraz) i wyświetlić je w tabeli. Obecnie mogę zrobić to z następujących powodów:

W moich articles.client.controller.js:

$scope.find = function() { 
     $articles = Articles.query(); 
}; 

... iw moich articles.server.controller.js:

var now = new Date(); 
var aYearFromNow = new Date(now.getTime() + 86400000*365); //add a year 
var aMonthAgo = new Date(now.getTime() - 86400000*30); //subtract roughly a month 

exports.list = function(req, res) { Article.find().where('date').lt(aYearFromNow).gt(aMonthAgo).sort('-created').populate('user', 'displayName').exec(function(err, articles) { 
     if (err) { 
      return res.send(400, { 
       message: getErrorMessage(err) 
      }); 
     } else { 
      res.jsonp(articles); 
     } 
    }); 
}; 

Problem polega na tym, że nie jest to dynamiczny sposób robienia rzeczy. Innymi słowy, chcę, aby użytkownik mógł określić, jak daleko wstecz i jak daleko do przodu chcą zobaczyć.

Jak mogę powiązać ze zmiennymi (np. "AYearFromNow" i "aMonthAgo") w moim widoku klienta, który zmieni parametry zapytania w moim kontrolerze serwera?

Odpowiedz

3

To chyba nie najczystszy sposób, ale można utworzyć nową usługę (lub edytować aktualny jeden do pracy z kilkoma parametrami):

.factory('ArticlesService2', ['$resource', 
    function($resource) { 
     return $resource('articles/:param1/:param2', { 
      param1: '', 
      param2: '' 
     }, { 
      update: { 
       method: 'PUT' 
      } 
     }); 
    } 
]); 

Następnie nazwać to w kontrolerze:

$scope.findWithParams = function() { 
    $scope.article = ArticlesService2.query({ 
     param1: $scope.aYearFromNow, 
     param2: $scope.aMonthAgo 
    }); 
}; 

na back-end, trzeba przygotować trasę:

app.route('/articles/:param1/:param2') 
    .get(articles.listWithParams) 

Dodaj funkcję kontrolera back-end:

exports.listWithParams = function(req, res) { 
    Article.find() 
    .where('date') 
    .lt(req.params.param1) 
    .gt(req.params.param2) 
    .sort('-created').populate('user', 'displayName') 
    .exec(function(err, articles) { 
     if (err) { 
      return res.send(400, { 
       message: getErrorMessage(err) 
      }); 
     } else { 
      res.jsonp(articles); 
     } 
    }); 
}; 

powinny działać, nie testowałem go jednak.

7

Innym sposobem jest po prostu przekazać parametry wyszukiwania w metodzie kwerendy tak:

$scope.searchart = function() { 
    Articles.query({start:$scope.startDate, end:$scope.endDate}, function(articles) { 
     $scope.articles = articles; 
    }); 
}; 

a następnie w kontrolerze po stronie serwera, czytać zapytanie parametry ciągu tak:

exports.searcharticle = function(req, res) { 
    Article.find().where('date').gt(req.query['start']).lt(req.query['end']).exec(function(err, articles) { 
     if (err) { 
      res.render('error', { 
       status: 500 
      }); 
     } else { 
      res.jsonp(articles); 
     } 
    }); 
}; 

W ten sposób nie wymaga więcej tras lub usług.

+0

To jest czystszy sposób radzenia sobie z tym, nie wymagając dodawania tras i bałaganu po stronie serwera. Korzystając z zapytania, można zachować ogólną charakterystykę listy, dodając warunkowo warianty mangusty. – HdN8