MongoDB查询 - 数据过滤

时间:2015-12-01 10:29:59

标签: javascript node.js mongodb express mongoose

我有一个数据过滤器表单,其中包含 15到20 下拉字段。下拉字段的目的是提供数据过滤选项。例如,请查看下图(图像来自Zoopla App ):

enter image description here

正如您在图像中看到的那样,它显示了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个参数进行 搜索

我有点难以理解我的观点,所以如果你不明白这个问题,请告诉我,我会再次尝试解释

1 个答案:

答案 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}}]