创建mongodb查询的简明语言解析器

MgoQuer的Python项目详细描述


返回有效MongoDB查询的简单查询语言。

MangGDB提供了一个强大但又冗长的灵活查询模型。 有时。mgoquery提供了一个简单的查询langauge来创建 用于构造MongoDB查询的简洁、类似搜索的语法。

目标

  1. Provide a safe and limited interface for querying MongoDB.
  2. 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的返回值转换函数应该是 价值。也可以验证输入并抛出错误 如果它是无效的。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用EntityManager有没有更有效的习惯用法?   Android上的java Google应用程序引擎(GAE)响应代码和cookie   如何在Java中创建单元测试?   java从DB获取特定列的最新行   java替换所有悬空元字符   java使用Hibernate删除SQL表中的数据   swing显示JComponent对象Java   java在确认内容类型后如何将URL保存到文件?   javascript如何从段落中选择大量单词?(硒)   java在Linux上使用BundleEnableTiveCode不起作用   java使用日志似然性来比较不同的mallet主题模型?   java无法在Tomcat7上运行Spring Boot 2.0:“由于缺少ServletWebServerFactory bean,无法启动ServletWebServerApplicationContext。”   java有办法显式引用非静态内部类实例吗?   java如何使用Spring的NamedParameterJdbcTemplate在MySQL数据库中创建和删除表?