【问题标题】:Validate a mongodb query syntax programmatically以编程方式验证 mongodb 查询语法
【发布时间】: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 是的,这是一种验证查询的昂贵方式,对于高性能服务器来说需要太多时间。

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    虽然它们可能无法 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 注入验证来帮助进行基本的健全性检查。
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多