基于用户输入在Mongoose中构建渐进式查询

时间:2018-02-22 23:06:18

标签: javascript node.js mongodb express mongoose

我正在编写一个简单的REST API,它基本上只是Mongo DB的包装器。我通常喜欢使用以下查询参数来控制查询(当然,使用适当的安全措施)。

  • >>> from __future__ import division ... ... result = [] ... text = "20 7/8 16 1/4" ... for num in text.split(): ... try: ... numerator, denominator = (int(a) for a in num.split('/')) ... result.append(numerator / denominator) ... except ValueError: ... result.append(int(num)) ... >>> result [20, 0.875, 16, 0.25]
    • 对于大于/小于比较的整数,可以使用_filter=<field_a>:<value_a>,<field_b><value_b><添加一些值
  • >
  • _sort=<field_c>:asc,<field_d>:desc
  • _fields=<field_a>,<field_b>,<field_c>
  • _skip=<num>

无论如何,关于这些的实现细节并不重要,只是为了表明我们想要影响查询的方式有很多种。

所以,我将“过滤器”部分编码为这样(剪掉许多验证部分,只是为了指出):

_limit=<num>

所以,到最后,我有一个传递给 case "filter": var filters = req.directives[k].split(','); var filterObj = {}; for(var f in filters) { // field validation happens here... splitFields = filters[f].split(':'); if (/^ *>/.test(splitFields[1])) { filterObj[splitFields[0]] = {$gt: parseInt(splitFields[1].replace(/^ *>/, ''), 10)}; } else if (/^ *</.test(splitFields[1])) { filterObj[splitFields[0]] = {$lt: parseInt(splitFields[1].replace(/^ *</, ''), 10)}; } else { filterObj[splitFields[0]] = splitFields[1]; } } req.directives.filter = filterObj; break; // Same for sort, fields, etc... 的对象。但是,我遇到的问题是.find()一旦保存为JS对象密钥就会变为$gt

这看起来像是一种合理的方式吗?我如何绕过需要'$gt'$gt等密钥的mongoose,以及想要引用它们的Javascript?

0 个答案:

没有答案