以编程方式验证 mongodb 查询语法

Posted

技术标签:

【中文标题】以编程方式验证 mongodb 查询语法【英文标题】:Validate a mongodb query syntax programmatically 【发布时间】:2018-08-26 05:50:21 【问题描述】:

我有一个 API 方法,用户可以在其中传递他们自己的查询。集合中的字段只是 ns,因此用户可能会传递如下内容:

v.search = function(query: Object)

   // query => ns:$in:['foo','bar',baz]  // valid!

   // query => ns:$in:  // invalid!

   // query => ns:/foo/     // valid!

);

有没有办法做到这一点,比如冒烟测试,可以使明显错误的查询失败?

我希望某些 MongoDB 库能够导出此功能……但很可能它们仅通过将查询发送到数据库来验证查询,实际上,查询有效的真正仲裁者/无效。

但我希望在将查询发送到数据库之前对其进行验证。

【问题讨论】:

为什么不在空白集合上运行它,看看是否有任何解析错误? @TarunLalwani 是的,这是一种验证查询的昂贵方式,对于高性能服务器来说需要太多时间。 【参考方案1】:

我认为除了反映 query.ns 对象并检查其每个属性/关联值之外,别无他法

【讨论】:

【参考方案2】:

MongoDB Compass 中的一些模块已开源。 有两个模块可能对您的用例有用:

mongodb-language-model mongodb-query-parser

虽然它们可能无法 100% 适合您的用例,但它应该可以为您提供非常接近的验证。比如npm install mongodb-language-model,那么:

var accepts = require('mongodb-language-model').accepts;

console.log(accepts('"ns":"$in":["foo", "bar", "baz"]'));  // true
console.log(accepts('"ns":"$in":'));                     // false
console.log(accepts('"ns":"$regex": "foo"'));              // true

也可能感兴趣,npm install mongodb-query-parser 将字符串值解析为 JSON 查询。例如:

var parse = require('mongodb-query-parser');
var query = '"ns":"$in":["foo", "bar", "baz"]';
console.log(parse.parseFilter(query));    // ns:'$in':['foo','bar','baz']

【讨论】:

很好,你能给我们可爱的观众展示一个使用mongodb-query-parser 的例子吗? 谢谢@Wan Bachtiar。当我偶然发现这个时,我试图找到一个用于清理 mongodb 语言的查询验证器。该库可以通过针对来自 nodejs 中 api 的输入的 MongoDB 注入验证来帮助进行基本的健全性检查。

以上是关于以编程方式验证 mongodb 查询语法的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式验证 JPQL(JPA 查询)

Spring Mongo 聚合查询以从 MongoDB 获取不同的国家名称和国家代码

关闭开启mongo授权验证authorization

MongoDB 查询文档

mongodb高级聚合查询

Mongo db中的身份验证:如何选择?