我正在编写一个简单的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?