创建mongodb查询的简明语言解析器
MgoQuer的Python项目详细描述
返回有效MongoDB查询的简单查询语言。
MangGDB提供了一个强大但又冗长的灵活查询模型。 有时。mgoquery提供了一个简单的查询langauge来创建 用于构造MongoDB查询的简洁、类似搜索的语法。
目标
- Provide a safe and limited interface for querying MongoDB.
- Provide a query language that is URL friendly
查询语法
mgoquery语法的灵感来自于xapian、lucene和 Gmail的高级查询搜索。
下面是基本格式的示例:
"x>3, x<5" | "y>10, z:True"
也就是说:
{'$or': [{'$and': [{'x': {'$gte': 3}}, {'x': {'$lte': 5}}]}, {'$and': [{'y': {'$gte': 10}}, {'z': True}]}]}
空格是可选的,这意味着上述查询可以重写为:
"x>3,x<5"|"y>10,z:True" "x>3, x<5" | "y>10, z:True"
表达式
表达式定义了 MongoDB查询。例如
{'x': 1}
mgoquery中的表达式如下:
$key <-> operator <-> $value
运算符如下:
equals = “:” greater than or equal to >= “>” less than or equal to <= “<”
需要注意的是,我们只使用大于/小于或等于 理论上,用户更容易理解他们的价值 使用将包含在结果中。
下面是一些示例:
x:3 => {'x': '3'} foo > 4 => {'foo': {'$gte': '4'}} y < x => {'y': {'$lte': 'x'}}
在上面的例子中要注意的一点是,这些值都是 串。我将解释如何帮助解析器知道何时需要 在分析的输出中使用不同的类型。
可以组合表达式以创建更复杂的 表达。有两种方法可以组合表达式,分组和 组合运算符。
组合运算符
与表达式中的运算符类似,组合运算符的作用是 有两种表达方式。
expression <-> operator <-> expression
下面是使用两个组合运算符的两个示例:
x:1 , y:2 => {'$and': [{'x': '1'}, {'y': '2'}]} x:1 | y:2 => {'$or': [{'x': '1'}, {'y': '2'}]}
“,”充当and运算符,表示这两个表达式都需要 在文档中匹配以将其返回。
“”用作或运算符,以便任一表达式都可以匹配 以便归还文件。
应该注意的是,您只能在 时间。没有一个先例是为了澄清 如何应用表达式。例如:
x:1, y:2 | foo:bar
解析器无法知道您是否打算使用“y:2” 要首先与“x:1”进行比较的表达式 “foo:bar”使用或。
使用组可以使用不同的组合运算符。
组
组允许您在 查询。以下是组的格式:
"expression [<-> operator]"
引号用于包装表达式和组合运算符 这样你就可以使用多个。下面是一个更复杂的例子 了解其工作原理:
"x>1, x<5" | "y>2, x:None"
在本例中,组被引号包围,并使用 还有接线员。然后,这两个组都用于or操作。英语 示例如下:
- Select all documents if:
- The key ‘x’ is greater than or equal to 1 AND The key ‘x’ is less than or equal to 5
- OR
- The key ‘y’ is greater than or equal to 2 AND The key ‘x’ does not exist or is None.
当前无法嵌套组,因为我们没有 这种复杂的查询。
使用解析器
下面是一个小会话,演示如何使用解析器来 构造查询:
Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53) [GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from pprint import pprint >>> from mgoquery import Parser >>> p = Parser() >>> result = p.parse('x > 5, y < 3') >>> print result {'$and': [{'x': {'$gte': '5'}}, {'y': {'$lte': '3'}}]}
转换查询中的值
从这些示例中可以看到,解析器的默认值不会使 努力理解每个表达式的值类型。整齐 若要将值转换为正确的类型,可以传递转换 解析程序构造函数的函数。
下面是一个简单的会话,使用上面的相同示例:
>>> p = Parser(conversion=lambda key, value: int(value)) >>> print(p.parse('x:1, y:2')) {'$and': [{'x': 1}, {'y': 2}]}
转换函数应该有两个参数,一个“key”和 “价值”。密钥是所需文档使用的密钥的名称 去质疑。因为MongoDB不支持对特定密钥强制类型 在文档集合中,我们使用密钥的名称来提供 关于使用哪种类型的建议。
下面是一个使用潜在日期解析函数的示例:
from mylibs import parse_date from mgoquery import Parser def value_conversion(key, value): if 'date' in key or 'time' in key: return parse_date(value) return value p = Parser(conversion=value_conversion) print(p.parse('startdate:2012-02-03')) # prints -> {'starttdate': datetime(2012, 2, 3)}
th的返回值转换函数应该是 价值。也可以验证输入并抛出错误 如果它是无效的。