从客户端控制器指定Mongo查询参数(MEAN.JS)

Specifying Mongo Query Parameters From Client Controller (MEAN.JS)

本文关键字:参数 MEAN JS 查询 Mongo 客户端 控制器      更新时间:2023-09-26

我正在使用MongoDB, Angular, Express和Node (MEAN stack)构建应用程序。

我使用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')在我的客户端视图,将改变查询参数在我的服务器控制器?

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

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

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

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

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