2015-12-01 117 views
1

我有一个数据过滤表单,其中包含大约15到20下拉字段。下拉字段的目的是提供数据过滤选项。例如看看下面的图像(图像是从Zoopla应用):MongoDB查询 - 数据过滤

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); 

    }); 
    }); 

正如你可以看到我现在用的是$或获取数据back.The问题是,如果用户只填写两个employeeName和扇区参数并搜索它发回的所有数据匹配employeeName或匹配扇区。实际上,我只想要匹配两个参数的数据。然后,我尝试使用$和,这解决了问题,但现在用户不能仅搜索employeeName或单个扇区等单个参数。它必须有两个参数才能返回数据。

总之我如何编辑我的API我的搜索路径给用户以任何方式与任何数量的参数搜索的灵活性。只是要清楚,搜索只会发生在页面的下拉字段内。因此,如果有20个下拉领域则用户的是可能性,能够搜索用最少的1个参数,最多20个参数

这是一个有点困难,我了解我的点所以,如果你不明白的问题,请让我知道,我会尽力解释再次

+0

构建一个查询构建器,这将是一个更好的选择 –

+0

@SarathNair感谢您的答复。你能再解释一下吗?或者如果你有任何资源?我不确定查询构建器的含义。 – Skywalker

+0

基本上你需要测试给定哪些参数,然后根据一系列预定义的查询选择相应的查询或者(不确定这里是否是适当的选择)。查询构建器基本上是Query对象的接口,其中每个方法都会返回查询对象,以便您可以动态添加标准。我会告诉你如何去做,因为我的JS太可怕了。 –

回答

0

我可以给你我是如何建立查询的例子。我在SOA项目中的许多小型服务中使用它。通常我在控制器中检查params是否根据我正在等待的类型进行验证(如果您不使用像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); 
    }); 
}); 

我也看到你想要的结果进行排序,所以你可能需要使用aggregate查询来妥善处理这一点。 而对于“最近期]”你可以使用_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}}] 
+0

非常感谢你的回答。它确实有帮助。我会马上执行并检查。我只是有一个问题,通过使用你的方法,如果用户发送一个HTTP调用5个或更多的参数,它仍然会检查所有5个参数,并返回一个匹配所有5个参数查询的结果?或者它一次只能处理一个参数? – Skywalker

+0

您必须自行编码检查,并且如果您收到此参数,则需要设置随附的查询。 在上面的例子中,我只处理2个参数(employeeName和sec)。 如果您想要处理价格,您必须检查请求中是否存在第一个参数(req.body.price),然后您需要根据您想要对此参数执行的操作更新您的查询。 – Metux