繁体   English   中英

MongoDB查询-数据过滤

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM