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

4 mongoose mongodb node.js mongodb-query

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

v.search = function(query: Object){

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

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

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

});
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点,如烟雾测试,可能会失败明显错误的查询?

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

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

Wan*_*iar 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
Run Code Online (Sandbox Code Playgroud)

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']}}
Run Code Online (Sandbox Code Playgroud)