我正在尝试使用Mongo Express设计REST API时如何处理更复杂的查询 . 不幸的是,我能找到的所有例子都太简单了 . 这是一个简单的例子,用于解决这个问题 . 我有群组,我有用户 . 每个小组内都有成员和1名领导 . 为简单起见,我将排除中间件和发布/放置/删除功能 .
路线看起来像这样:
app.get('/groups', groups.all);
app.get('/groups/:groupId', groups.show);
app.param('groupId', groups.group);
控制器看起来像这样:
/**
* Module dependencies.
*/
var mongoose = require('mongoose'),
Group = mongoose.model('Group'),
_ = require('lodash');
/**
* Find group by id
*/
exports.group = function(req, res, next, id) {
Group.load(id, function(err, group) {
if (err) return next(err);
if (!group) return next(new Error('Failed to load group ' + id));
req.group = group;
next();
});
};
/**
* Show a group
*/
exports.show = function(req, res) {
res.jsonp(req.group);
};
/**
* List of Groups
*/
exports.all = function(req, res) {
Group.find().sort('-created').populate('user', 'name username').exec(function(err, groups) {
if (err) {
res.render('error', {
status: 500
});
} else {
res.jsonp(groups);
}
});
};
然后模型看起来像这样:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
/**
* Group Schema
*/
var GroupSchema = new Schema({
created: {
type: Date,
default: Date.now
},
updated: {
type: Date,
default: Date.now
},
enableScores: {
type: Boolean,
default: false
},
name: {
type: String,
default: '',
trim: true
},
creator: {
type: Schema.ObjectId,
ref: 'User'
},
commissioner: {
type: Schema.ObjectId,
ref: 'User'
}
});
/**
* Validations
*/
GroupSchema.path('name').validate(function(name) {
return name.length;
}, 'Name cannot be blank');
/**
* Statics
*/
GroupSchema.statics.load = function(id, cb) {
this.findOne({
_id: id
})
.populate('creator', 'name username')
.populate('commissioner', 'name username')
.exec(cb);
};
mongoose.model('Group', GroupSchema);
如果我想根据委托人字段查询REST API,该怎么办?或创建者,名称或创建的字段?这是否可以使用Express的路由,如果是这样,是否有最佳做法?
似乎不是处理这些独特情况中的每一种,最好是通用的东西返回基于req.params匹配的所有组,因为如果模型稍后更改,我将不需要更新控制器 . 如果这是这样做的话,那么可能修改all()函数以根据req.params进行查找是解决方案吗?因此,如果没有提供任何内容,那么它会返回所有内容,但是当您提供更多获取参数时,它会向下搜索您要查找的内容 .
1 回答
我建议使用
req.query
来匹配架构中的字段 . 如果你发送像/groups?name=someGrp&enableScores=1
这样的请求,req.query
将会是这样的......你可以把这个对象传递给像这样的find方法......
此方法适用于简单的属性匹配查询,但对于比较和数组属性等其他内容,您必须编写其他代码 .