前言
以下是一個mongo查詢的綜合應用,即介紹一個生產中實際應用的模糊查詢,當然其實也很簡單,主要用到mongo中的模糊查詢和$or查詢,以及并的關系,下面是一個mongo中的一條記錄
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
{ "_id" : "ffe6a068-9043-4334-97d2-75387340e655" , "file_id" : "ffe6a068-9043-4334-97d2-75387340e655" , "name" : "中國正大" , "update_time" : NumberInt(1554975642), "create_time" : NumberInt(1554975642), "content" : "中國正大相關信息" , "file_url" : "" , "file_type" : "" , "user_ids" : [ 1.0, 10.0 ], "group_ids" : [ ], "is_common" : NumberInt(0), "confidence" : -1.0, "obj_id" : "" , "source" : "" , "content_time" : "" , "author" : "" , "summary" : "" , "info_type" : "00" , "sub_info_type" : "" , "title" : "" , "word_num" : NumberInt(8) } |
對上面一條記錄或者更多條記錄我們生產中的需求是:查詢出集合中(mongo中的集合即是mysql中的表),name或content中包含"正大"二字的記錄(關鍵詞即是用戶隨機輸入的,其實是一個變量),并且時間戳的值大于某一個開始時間和某一個結束時間(這個也是用戶在前端進行選擇,然后我們拿到前端的請求來進行查詢的),并且文件的類型即info_type字段的值為"00",“00”代表的是word也是前端用戶選擇后我們獲取的條件之一,當然還有其他條件想進行嘗試可以自由發揮
下面就是使用mongo語句進行實現的上面的需求:
1
|
db.getCollection( "subscribe_test" ).find({$ or :[{ "name" :{ "$regex" : "正大" }},{ "content" :{ "$regex" : "正大" }}], "update_time" :{$gte:1,$lte:2000000000},info_type: "00" }) |
對于查詢我們有的時候會選擇在程序中進行,有的小伙伴會問上面的mongo語句怎么在編程語言中進行實現,下面是用python語言中進行實現的,我們會引用python中操作mongo的一個模塊即pymongo模塊可以使用pip install pymongo
在控制臺或cmd中進行一鍵安裝,至于如何使用也很簡單,可以自行百度或者訪問我的另一篇博客:pymono的簡單使用,下面附上用python代碼實現上面需求的業務代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
import pymongo import re # 創建數據庫連接 client = pymongo.MongoClient(host= '127.0.0.1' , port=8014) #填寫自己本機數據庫的ip和port或者遠程服務器數據庫的ip和port # 指定數據庫db1,沒有則創建數據庫db1 db = client.dataretrieve #指定數據庫中指定的表 collection=db.subscribe_test "" "1、對表中的數據進行查詢" "" "" " db.collection.find(query, projection) query :可選,使用查詢操作符指定查詢條件 projection :可選,使用投影操作符指定返回的鍵。查詢時返回文檔中所有鍵值, 只需省略該參數即可(默認省略)。 " "" query = {} query[ "$or" ] = [ { "name" : re.compile( "正大" )}, { "content" : re.compile( "正大" )}, ] query[ "file_type" ] = "00" query[ "update_time" ] = { "$gte" : 0, "$lte" : 2000000000} row=collection.find(filter=query) for r in row: print(r[ "content" ]) |
下面是生產中實際的開發代碼,只供參考,只是把上面的一些常量,換成了從前端請求的數據:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
def person_handler(req_params, page_size, search_offset): "" " 去mongo中查詢個人數據 :param req_params: :param page_size: :param search_offset: :return: " "" results = [] query = {} update_time = {} if 'start_time' in req_params and req_params[ "start_time" ]: start_time = int (req_params[ "start_time" ]) update_time[ '$gte' ] = start_time if 'end_time' in req_params and req_params[ 'end_time' ]: end_time = int (req_params[ "end_time" ]) update_time[ '$lte' ] = end_time if update_time: query[ "update_time" ] = update_time if 'file_type' in req_params and req_params[ 'file_type' ]: query[ "file_type" ] = req_params[ "file_type" ] if 'user_ids' in req_params and req_params[ 'user_ids' ]: query[ 'user_ids' ] = int (req_params[ 'user_id' ]) serch_keywords = req_params[ "search_keywords" ] query[ "$or" ] = [ { "name" : re.compile(serch_keywords)}, { "content" : re.compile(serch_keywords)}, ] print(query) result = person_mongodao.search(filter=query).skip(search_offset).limit(page_size) count = person_mongodao.search(filter=query).skip(search_offset).limit(page_size). count () for row in result: results.append(row) additions = { "word_segs" : req_params[ "search_keywords" ], "remind" : 0} print( "查詢結果" , results) return results, additions, count |
如果有小伙伴說我用的不是python語言譬如java用代碼怎么實現呢?那么如果你會寫mysql來實現上面的需求的話本博主可以推薦你使用mongo的一款可視化工具Studio 3T來將mysql語句轉換成mongo語句,python語句,java語句等
mysql語句也類似mongo語句有一個控制臺可以來進行書寫mysql語句,然后進行查詢之后將結果進行轉換
總結
以上就是關于mongo模糊查詢的簡單使用,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。
原文鏈接:http://www.cnblogs.com/sui776265233/p/10694958.html