如何在Mongodb数据库中找到与Mongoose find()方法匹配某个URI参数的所有文档?

时间:2016-05-08 14:50:19

标签: node.js mongodb express mongoose

我正在制作一个API,虽然有很多教程详细介绍了如何使用Mongoose findById()方法从Mongodb数据库中检索文档,但我似乎找不到一种方法来检索一些基于其他价值观的文件。

以下是相关代码:

var referenceRoute = router.route('/purchases/:reference')

referenceRoute.get(function(req, res) {
    Model.find(req.params.reference, function(err, purchases) {
        if (err)
            res.send(err);
        res.json(purchases);
    });
});

这样做的目的是允许用户通过URI参数检索包含这些参考值的文档,例如www.example.com/api/purchases/674332457。

如果它与我有关,我正在使用Express,Node.js,Mongodb,Mongoose和body-parser。

2 个答案:

答案 0 :(得分:0)

Mongoose模型find函数接受filter参数。您可以创建任何查询来选择文档:{ field1: value1, field2: value2... }。此外,您可以使用大多数mongodb运算符,例如$and, $or等。

referenceRoute.get(function(req, res) {
    var filter = { url: req.params.reference };
    Model
      .find(filter)
      .then(purchases => res.send(purchases))
      .catch(err => res.send(err));
});

顺便说一句,Mongoose支持承诺,更好地使用它们,而不是回调。除此之外,您当前的代码有错误,如果出现错误,您会发送两次响应,这在我的示例中已得到修复。

答案 1 :(得分:0)

这是我发现的解决方案似乎非常适合使用URL查询字符串作为Mongodb查询。因此,如果有人查询,例如www.example.com/api/purchases/query?reference=12345,那么他们将获得与该参考值匹配的集合中的所有文档。

var referenceRoute = router.route('/purchases/query')

referenceRoute.get(function (req, res) {
  Model.find(req.query, function (err, donations) {
        res.send(donations);
    });
});

最好将它称为var queryRoute = router.route('/purchases/query'),因为它适用于不同的查询(尽管我似乎无法让它在多个查询上工作)。

这里找到了原始答案(How dangerous is a mongo query which is fed directly from a URL query string?)。