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

时间:2018-03-17 05:58:15

标签: node.js mongodb mongoose mongodb-query

我有一个API方法,用户可以传入自己的查询。集合中的字段只是ns,因此用户可能会传递类似:

v.search = function(query: Object){

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

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

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

});

是否有某种方法可以做到这一点,比如冒烟测试可能会导致明显错误的查询失败?

我希望一些MongoDB库可以导出这个功能......但是很有可能他们只通过将查询发送到数据库来验证查询,实际上,这是查询有效的真正仲裁者/无效。

但我希望在将查询发送到数据库之前验证该查询。

2 个答案:

答案 0 :(得分:5)

属于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']}}

答案 1 :(得分:2)

除了反映query.ns对象并检查其每个属性/相关值

之外,我认为不可能做其他事情。