如何使用动态路由在node.js中查找我的mongoose数据库中的人员

时间:2015-01-05 04:29:32

标签: express mongoose mongodb-query

    app.get('/admin/reservas/:param', function(req, res) {
        var param = req.param("param");
        console.log(param);
        mongoose.model('Something').findOne(
            {
            id: param
            }, function(err, obj) {
                res.send(obj);
                console.log(obj);
            }
        );
    });

我有这条路线,这个EJS:

<% for(var i = 0; i < data.length; i++) { %>
  <td> <a href= <%="/admin/reservas/" + data[i].id  + ""%>><%= data[i].id   %></a></td>
  <td> <a href= <%="/admin/reservas/" + data[i].name    + ""%>><%= data[i].name     %></a></td>
<% } %>

很好,当我点击id时,我会在数据库中找到我想要的id,但我希望能够通过名称找到它。

所以我试图改变路线:

    app.get('/names/:param', function(req, res) {
        var param = req.param("param");
        console.log(param);
        mongoose.model('Something').findOne(
            {
            id: param,
            name: param
            }, function(err, obj) {
                res.send(obj);
                console.log(obj);
            }
        );
    });

但是返回任何内容,包括id和名称

1 个答案:

答案 0 :(得分:1)

默认情况下,MongoDB查询参数始终是逻辑条件。为了使用逻辑,有$or运算符:

    app.get('/admin/reservas/:param', function(req, res) {
        var param = req.param("param");
        console.log(param);
        mongoose.model('Something').findOne(
            {
                "$or": [
                    { id: param },
                    { name: param }
                ]
            }, function(err, obj) {
                res.send(obj);
                console.log(obj);
            }
        );
    });

$or运算符使用一组查询文档来考虑条件。这是一个&#34;短路&#34;匹配评估为true的第一个条件使该语句成立。

如果没有特定问题,至少会是这样。请参阅_id,它的id别名是MongoDB和Mongoose的特殊值。默认情况下,这将尝试&#34;施放&#34;如果提供的字符串无效,例如&#34; fred&#34;例如。

这会在提供查询参数时导致异常。因此,底线规则是你不能&#34;混合类型&#34;以这种方式处于 ObjectID 条件中的某些内容无法从$or转换后继续存在。你必须这样做&#34;逻辑上&#34;以不同的方式测试价值 它是什么:

String

这意味着现在以一种mongoose将解析它的方式构建查询,考虑到模式&#34;类型&#34;然后申请就没有错误,因为决定哪个字段在其他地方进行查询。

当然,你可以绕过&#34;绕过&#34; mongoose方法行为,只需使用原始驱动程序:

    app.get('/admin/reservas/:param', function(req, res) {
        var param = req.param("param");
        console.log(param);

   var query = {};

       try {
           var id = mongoose.mongo.ObjectID(param);
           query = { "id": id };
       } catch {
           query = { "name": param };
       }

        mongoose.model('Something').findOne(
            query, function(err, obj) {
                res.send(obj);
                console.log(obj);
            }
        );
    });

但是当然你需要自己进行类型转换,不仅仅是为了测试&#34;否则即使是正确的&#34; String&#34;表示 app.get('/admin/reservas/:param', function(req, res) { var param = req.param("param"); console.log(param); var id =""; try { id = mongoose.mongo.ObjectID(param); } mongoose.model('Something').collection.findOne( { "$or": [ { id: id }, { name: param } ] }, function(err, obj) { res.send(obj); console.log(obj); } ); }); 的值不起作用。