Python札记 -- MongoDB模糊查询
最近在使用MongoDB的时候,遇到了使用多个关键词进行模糊查询的场景。竹风使用的是mongoengine库。
查了各种资料,最后总结出比较好用的方法。先上代码,后面进行详细说明。如下:
#!/usr/bin/env python
#coding:utf-8 import re
import mongoengine
from mongoengine import * mongoengine.register_connection('default', 'test', host='127.0.0.1') class TestData(Document):
name = StringField()
content = StringField() TestData.objects.get_or_create(name='天地玄黄',defaults={'content':'abc123'})
TestData.objects.get_or_create(name='宇宙洪荒',defaults={'content':'ABC123'})
TestData.objects.get_or_create(name='天天向上',defaults={'content':'Abc123'}) def print_arr(obj):
print obj.name,obj.content def fuzzy_query_by_contains():
print "\n###使用mongoengine的contains进行查询"
print "#contains区分大小写:"
test_data_list = TestData.objects(content__contains='abc123')
map(print_arr,test_data_list) print "#icontains不区分大小写:"
test_data_list = TestData.objects(content__icontains='abc123')
map(print_arr,test_data_list) def fuzzy_query_by_Q():
print "\n###使用Q来进行查询"
test_data_list = TestData.objects(
Q(name__icontains=u'天地') | Q(name__icontains=u'宇宙'))
map(print_arr,test_data_list) def fuzzy_query_by_pymongo():
print "\n###使用raw queries,New in version 0.4"
print "#单个查询条件"
search = {
'__raw__':{
'content':{'$regex':'A\S+\d+'},
},
}
test_data_list = TestData.objects(**search)
map(print_arr,test_data_list) print "#多个查询条件"
search = {
'__raw__':{
'name':{'$in':[re.compile(u'天天'),re.compile(u'宇宙')]},
},
}
test_data_list = TestData.objects(**search)
map(print_arr,test_data_list) if __name__ == '__main__':
fuzzy_query_by_contains()
fuzzy_query_by_Q()
fuzzy_query_by_pymongo()
先讨论一下fuzzy_query_by_contains方法,这里用的是mongoengine提供的contains操作。值得注意的是,contains区分大小写,而icontains不区分大小写。这种方式在针对一个关键词进行模糊查询的时候特别方便。
然后是fuzzy_query_by_Q方法,这里结合了contains和Q来进行组合查询。当使用Q()来进行组合查询时,必须使用位运算符(|和&),而不能使用or,and来进行逻辑运算。这种方式比较合适确定关键词数目的情况。如果关键词的数目是不定的,这种方式就略显纠结了。
竹风在动态关键词模糊查询的问题也是纠结良久,差点就要对每个关键词分别查询,然后取交集凑结果了。后来在文档中发现,mongoengine有__raw__这个参数,可以执行PyMongo的查询(version 0.4提供的新功能)。于是几经试验,fuzzy_query_by_pymongo方法就出炉了。
PyMongo支持正则表达式,提供了两种方法,一种是使用$regex,另一种是使用re.compile()。
在例子中,对单个关键词进行模糊查询,对应的代码为:{'$regex':'A\S+\d+'}
接着就是对多个关键词进行查询,对应的代码为:{'$in':[re.compile(u'天天'),re.compile(u'宇宙')]}
对代码进行一些修改,以便接受多个关键词,代码如下:
def fuzzy_query_by_pymongo():
print "#多个查询条件"
keyword = u'天天 宇宙'
search = {'__raw__' : {'name':{'$in':map(re.compile,keyword.split())}}}
test_data_list = TestData.objects(**search)
map(print_arr,test_data_list)
顺带一提,例子中创建数据是用的get_or_create,会返回一个元组,第一个元素是创建or查询的对象,第二个元素是是否创建成功。文档中的推荐用法如下:
>>> a, created = User.objects.get_or_create(name='User A', defaults={'age': })
>>> b, created = User.objects.get_or_create(name='User A', defaults={'age': })
>>> a.name == b.name and a.age == b.age
True
最后是例子运行的结果,返回的结果顺序可能略有不同,不必在意。
$ python mongodb_test.py ###使用mongoengine的contains进行查询
#contains区分大小写:
天地玄黄 abc123
#icontains不区分大小写:
天地玄黄 abc123
宇宙洪荒 ABC123
天天向上 Abc123 ###使用Q来进行查询
天地玄黄 abc123
宇宙洪荒 ABC123 ###使用raw queries,New in version 0.4
#单个查询条件
宇宙洪荒 ABC123
天天向上 Abc123
#多个查询条件
宇宙洪荒 ABC123
天天向上 Abc123
Python札记 -- MongoDB模糊查询的更多相关文章
- Python 代码实现模糊查询
Python 代码实现模糊查询 1.导语: 模糊匹配可以算是现代编辑器(如 Eclipse 等各种 IDE)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的文件名,并提供一个推荐列 ...
- 转】Nodejs对MongoDB模糊查询
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! Posted: Jul 1, 2013 Tag ...
- 10 行 Python 代码实现模糊查询/智能提示
10 行 Python 代码实现模糊查询/智能提示 1.导语: 模糊匹配可以算是现代编辑器(如 Eclipse 等各种 IDE)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的 ...
- MongoDB 模糊查询,及性能测试
var mongodb = new MongoClient("mongodb://127.0.0.1:27017");//MongoServer.Create();//创建链接 v ...
- MongoDB模糊查询
模糊查询简介MongoDB查询条件可以使用正则表达式,从而实现模糊查询的功能.模糊查询可以使用$regex操作符或直接使用正则表达式对象. MySQL MongoDB select * from s ...
- MongoDB 模糊查询like
1.LIKE模糊查询userName包含A字母的数据(%A%)-- SQL:SELECT * FROM UserInfo WHERE userName LIKE "%A%" -- ...
- MongoDB模糊查询,以及MongoDB模糊查询时带有括号的情况
模糊查询 记录如下: { "_id" : ObjectId("5c3d486d24aa9a000526367b"), "name" : &q ...
- MongoDB模糊查询 工具
{"Exception":{$regex:"定时发送邮件"}} //模糊查询条件 {"DateTime":-1} // ...
- Python——数据库like模糊查询
在Python中%是一个格式化字符,所以如果需要使用%则需要写成%%.将在Python中执行的sql语句改为:sql = "SELECT * FROM table_test WHERE va ...
随机推荐
- 【转】oracle查询用户表,函数,储存过程,
◆Oracle查询用户表空间:select * from user_all_tables ◆Oracle查询所有函数和储存过程:select * from user_source ◆Oracle查询所 ...
- C# mvc DropDownList选中状态无效情况分析
情况: DropDownList控件使用List<SelectListItem>()设置下拉选项和默认值.当控件的Name和后台的ViewBag(或ViewData)的Key重复,会导致选 ...
- ng-init,ng-controller,ng-model
1.ng-init 用于初始化数据,跟在$scope插入数据一样,但是在配合repeat指令时候比较有用: <div ng-repeat="arrOuter in arr" ...
- 魔性の分块 | | jzoj1243 | | 线段树の暴力
题目的打开方式是酱紫的 然而作为一只蒻蒟根本不会线段树该怎么办呢? sro MZX orz 是这样说的:用分块啊! 分块 根据紫萱学姐的教程,分块的打开姿势是这样的: 我们要对一个数组进行整体操作 ...
- [MOSEK] Stupid things when using mosek
1.2016-8-14 我希望把一个qp问题的代码从conic constraints改为无外加约束,仅适用variable bounds的线性不等式约束 于是原来的约束代码为 if (r == MS ...
- arcgis操作笔记-根据属性提取某区域要素
1. 提取
- linux系统编程之错误处理
在linux系统编程中,当系统调用出现错误时,有一个整型变量会被设置,这个整型变量就是errno,这个变量的定义在/usr/include/errno.h文件中 #ifndef _ERRNO_H /* ...
- IOS调用WCF服务,WCF服务器进行上传图片
1.IOS端采用post方式请求服务器端的url地址 如:http://192.168.0.12:50000/serverce1.svc/upload IOS端的代码采用base64位编码的方式传值给 ...
- c#利用WebClient和WebRequest获取网页源代码的比较
前几天举例分析了用asp+xmlhttp获取网页源代码的方法,但c#中一般是可以利用WebClient类和WebRequest类获取网页源代码.下面分别说明这两种方法的实现. WebClient类获取 ...
- js如何判断手机机型
<script language="javascript"> window.onload = function () { alert("1"); v ...