我有一个数据过滤器表单,其中包含 15到20 下拉字段。下拉字段的目的是提供数据过滤选项。例如,请查看下图(图像来自Zoopla App ):
正如您在图像中看到的那样,它显示了7个下拉字段。用户为每个字段选择一个选项,或只为搜索按钮选择几个字段并点击,结果显示。
我正在尝试实现相同的功能,但这是一个问题。
到目前为止我尝试了什么!
用户可以选择是填充所有下拉字段,还是只填2,仍然可以搜索。搜索功能非常流畅。用户只能选择 ONE 下拉字段,并将所有其余字段留空,仍然可以获得结果。
为了实现这一点,我在我的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);
});
});
正如您所看到的,我正在使用 $或来获取数据。问题是,如果用户只填写employeeName和sector参数并进行搜索,则会发回所有数据匹配employeeName或匹配扇区。实际上我只想要包含两个参数的数据。然后我尝试使用 $和修复了问题,但现在用户无法搜索像employeeName或扇区这样的单个参数。它必须具有两个参数才能返回数据。
总结一下如何在我的API中编辑我的搜索路径,以便用户以任何方式和任意数量的参数进行搜索。为了清楚起见,搜索只会在页面的下拉字段中进行。因此,如果有20个下拉字段,则用户可以使用至少1个参数和最多20个参数进行 搜索
我有点难以理解我的观点,所以如果你不明白这个问题,请告诉我,我会再次尝试解释
答案 0 :(得分:0)
我可以举例说明如何构建查询。我在SOA项目中的许多小型服务中使用它。通常我会在控制器中检查根据我正在等待的类型验证参数(如果你不使用orm&like像Mongoose),那么我在模型中构建查询。 无论如何,我希望这会对你有所帮助。
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);
});
});
我还看到您要对结果进行排序,因此您可能需要使用aggregate查询来正确处理此问题。 对于"最重要的"你可以使用_id embeded timestamp:
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}}]