OData URI到JSON mongoDB查询

时间:2014-11-17 17:44:39

标签: json node.js mongodb mongoose odata

我正在使用nodejs和mongoDB进行项目。在get方法中,客户端发送一个OData uri作为例子

http://localhost:8080/persons?$filter=name eq 'test'

现在我想在我的应用程序中转换mongoDB对象中$ filter的结果,如此

var filter = {"name" : "test"}

并将该对象放在像这样的查找查询中

db.collection.find(filter)

这只是一个简单的例子,但在我的应用程序中,它更复杂。见http://www.odata.org/documentation/odata-version-2-0/uri-conventions
我问是否存在一个npm模块,或者我必须手动完成一些复杂的事情。 Bref,我要求更好的解决方案。
谢谢

1 个答案:

答案 0 :(得分:-1)

好的,这有两个方法,这取决于你需要如何使用GET请求,正如你在你提供的链接中看到的那样,请求是由一个URL形成的,tha是直到第一个/,然后是路径,这是斜杠(/)之间的所有参数,最后是查询,这是“?”之后的所有内容。

你在问题​​中说的是你需要在一个查询参数中嵌入一个完整的查询,唯一有用的用例就是如果你将其他查询参数用于其他事情(即使有一些重新思考)应该做的是处理更简单的任务)。无论如何,如果这是你需要它的方式,我会建议用你需要的查询发送一个urlencoded JSON.strigify处理对象然后和urldecode,解析服务器端,这是最简单的方法。 http://www.yourDomain.com/persons?$滤波器=%7B%22name%22%3A%22test%22%7D

app.get("/persons", function(req, res){

    console.log(req.query); // Should output {filter : "%7B%22name%22%3A%22test%22%7D"}
    var query = req.query;
    query = decodeURIComponent(query.filter);
    query = JSON.parse(query);

    db.collection("persons").find(query).toArray(function(error, result){
        if(error){
            res.status(500).send("Database problem");
        } else if(result.length == 0){
            res.status(204).send("No content");
        } else {
            res.json({result : result}); // Embedded in an object for security reasons
        }
    });
});

另一方面,如果您需要查询,那就是全部,那么您的自我更加复杂。使用GET请求的正确方法就是执行查询,例如: http://www.yourDomain.com/persons?name=test

如果你这样做并使用像express这样的框架,那么这是最容易的事情......在路径解析器中,你从请求对象中获取查询,就是这样,例如:

app.get("/persons", function(req, res){
    console.log(req.query); // Should output {name : "test"}
    db.collection("persons").find(req.query).toArray(function(error, result){
        if(error){
            res.status(500).send("Database problem");
        } else if(result.length == 0){
            res.status(204).send("No content");
        } else {
            res.json({result : result}); // Embedded in an object for security reasons
        }
    });
});