[英]MongoDB Queries - Data Filtration
我有一个数据过滤器表单,其中包含约15至20个下拉字段。下拉字段的目的是提供数据过滤选项。 例如,看下面的图片( 该图片来自Zoopla App ):
正如您在图像中看到的,它显示了7个下拉字段。 用户为每个字段或仅几个字段选择一个选项,然后点击搜索按钮,显示结果。
我正在尝试实现相同的功能,但是存在问题。
到目前为止我尝试过的!
用户可以选择填写所有下拉字段还是仅填写2,仍然可以搜索。 搜索功能非常流畅。 用户只能选择一个下拉字段,而将其余所有字段留空,仍然可以得到结果。
为了实现这一点,我在API中创建了以下路由。
app.get('/user/test',function(req, res) {
User.find({"$or": [{"employeeName": req.body.employeeName}, {"sector": {$elemMatch:{sec: req.body.sec}}} ] }, function(err, user)
{
if (err)
{
res.send(err);
}
console.log(user);
res.json(user);
});
});
如您所见,我正在使用$ or取回数据。问题是,如果用户仅填写employeeName和扇区参数并进行搜索,它将发回与employeeName或扇区相匹配的所有数据。 实际上,我只想要与两个参数都包含在内的数据。 然后我尝试使用$ and来解决问题,但是现在用户不能只搜索单个参数,例如employeeName或扇区。 它必须同时具有两个参数才能返回数据。
总结一下如何在我的API中编辑我的搜索路线,从而为用户提供以任何方式和任意数量的参数进行搜索的灵活性。 为了清楚起见,搜索仅在页面上的下拉字段内进行。 因此,如果有20个下拉字段,则用户可以使用最少1个参数和最多20个参数进行搜索
我很难理解我的观点,所以如果您不明白这个问题,请告诉我,我会尽力再解释一次
我可以举一个例子说明如何构建查询。 我在SOA项目的许多小型服务中使用了此功能。 通常,我会根据要等待的类型(如果您不使用像Mongoose这样的orm)来检查控制器是否已验证了参数,那么我会在模型中构建查询。 无论如何,我希望这会对您有所帮助。
app.get('/user/test',function(req, res) {
// You initialize your mongodb query
var query = {};
// If employeeName was set, then you update the query
if (req.body.employeeName){
query.employeeName = req.body.employeeName;
}
// Same for the sector
if (req.body.sec){
query.sector = {$elemMatch:{sec: req.body.sec};
}
// and you keep going for every paramaters...
// Then you find with the query, if no parameter query = {}
User.find(query, function(err, users){
if (err){
res.send(err);
}
console.log(users);
res.json(users);
});
});
我还看到您想对结果进行排序,因此您可能需要使用聚合查询来正确处理此问题。 对于“最新”,您可以使用_id嵌入时间戳:
ObjectId("564afd0b65d680ff47ccfc59").getTimestamp();
// =>ISODate("2015-11-17T10:10:19Z")
//And in a shorter way:
db.collection.find(query).sort({_id:-1})
//Inside an aggregate it gives:
[{$sort: {_id: -1}}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.