以编程方式验证 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 查询语法的主要内容,如果未能解决你的问题,请参考以下文章