【问题标题】:Specifying Mongo Query Parameters From Client Controller (MEAN.JS)从客户端控制器 (MEAN.JS) 指定 Mongo 查询参数
【发布时间】:2014-09-08 17:57:19
【问题描述】:

我正在使用 MongoDB、Angular、Express 和 Node(MEAN 堆栈)构建应用程序。

我使用 MEAN.JS 生成器来搭建我的应用程序。

我将使用文章模块作为参考。

假设我的文章集合中有 7000 条记录,并且每条记录都有一个与之关联的日期。每次加载页面以查看表中的记录时,将所有 7000 条记录加载到内存中效率很低,因此我看到了可怕的性能损失。出于这个原因,我只想加载日期在(1 个月前)到(1 年后)范围内的记录,并将它们显示在表格中。我目前可以通过以下方式做到这一点:

在我的文章.client.controller.js 中:

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

...在我的文章中.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);
        }
    });
};

问题在于这不是一种动态的做事方式。换句话说,我希望用户能够指定他们希望看到多远和多远。

如何在客户端视图中绑定变量(例如“aYearFromNow”和“aMonthAgo”)以更改服务器控制器中的查询参数?

【问题讨论】:

    标签: javascript angularjs mongodb express meanjs


    【解决方案1】:

    这可能不是最干净的方式,但您可以创建一个新服务(或编辑当前服务以使用多个参数):

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

    然后在你的控制器中调用它:

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

    在后端,您需要准备一条路线:

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

    给你的后端控制器添加一个函数:

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

    应该可以,不过还没有测试过。

    【讨论】:

      【解决方案2】:

      另一种方法是只在查询方法中传递搜索参数,如下所示:

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

      然后在服务器端控制器,读取查询字符串参数,如下所示:

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

      这种方式不需要更多的路线或服务。

      【讨论】:

      • 这是一种更简洁的处理方式,不需要添加路由和混乱的服务器端。通过使用查询,您可以通过有条件地添加 mongoose 参数来保持列表方法的通用性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2019-07-26
      • 2017-02-06
      相关资源
      最近更新 更多