OData URI 到 JSON mongoDB 查询

Posted

技术标签:

【中文标题】OData URI 到 JSON mongoDB 查询【英文标题】:OData URI to JSON mongoDB query 【发布时间】:2015-01-14 17:11:02 【问题描述】:

我正在使用 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 模块来执行此操作,或者我是否必须手动执行某些复杂的操作。布雷夫,我正在寻求更好的解决方案。谢谢

【问题讨论】:

任何结果,您是否继续这个项目? 有人帮我翻译了剑道的网格here。这可能会有所帮助。 【参考方案1】:

好的,这有两种方法,这取决于您需要如何使用 GET 请求,正如您在提供的链接中看到的那样,请求由 URL 形成,这是直到首先是 /,然后是路径,这是斜杠 ( / ) 之间的所有参数,最后是查询,即 "?" 之后的所有参数

您在问题中所说的是,您需要将完整的查询嵌入到单个查询参数中,我认为唯一有用的用例是您是否将其他查询参数用于其他事情(即使有一些重新考虑应该做以处理更简单的任务)。无论如何,如果这是您需要的方式,我建议您发送一个带有您需要的查询的 urlencoded JSON.strigify 处理对象,然后进行 urldecode,在服务器端解析它,这是最简单的方法。 http://www.yourDomain.com/persons?$filter=%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
        
    );
);

【讨论】:

好吧,如果我理解得很好,你预先安排我发送一个 urlencoded JSON.strigify 或使用简单的 get 方法,然后通过 OData 方法发送我的 url ?? 是的,根据文档,您应该嵌入,这不是最优雅或最标准的工作方式,但它可以完成工作。 虽然搜索了一下,我找到了解析请求的这个库github.com/qraftlabs/node-odata-parser,看看,让我知道。 我发现这不是我想要的。假设我使用你的第一种方法。如果我在 url "libelle": "test" 中给出这样的查询,它会正常工作,但我会给出这样的否定形式:"libelle": $ne: "test" 它不会起作用,因为我将有一个 JSON 解析错误由于 $. 终于开始工作了。我必须将 $ne 放在引号之间,所以我会有类似的内容:"libelle": "$ne": "test" 现在我将使用该解决方案,但如果我有一个如何使用 OData URI 的解决方案,它会更好。感谢您的帮助@jmdiego

以上是关于OData URI 到 JSON mongoDB 查询的主要内容,如果未能解决你的问题,请参考以下文章

是否有用于 OData 协议 Uri 的 .NET 类包装器

将OData Uri转换为他的等效Linq表达式

将 OData Uri 转换为等效的 Linq 表达式

使用 OData 的 ASP.Net Core Web API 实现对于单个实体 URI 失败

json 导入到cosmos

OData 错误:URI 中指定的查询无效。该属性不能在查询选项中使用