mongoDB 對接python

1、mongo授權

詳細授權請參見如下文本

授權完畢之後請修改mongodb.conf中auth = true,退出重新進入,則創建的用戶必須使用密碼纔可以登錄了

其中mongodb.conf可以配置日誌生成的路徑,是否外部主機可以訪問等,如果需要配置的話,將裏面的127.0.0.1改成0.0.0.0即可

2、開啓服務

ps -ef | grep mongo   # 這個是如果已經開啓了可以查詢

ps -ef |grep mongod |grep -v grep |awk '{print $2}' |xargs kill -9     #  可以殺死開啓的mongo服務

mongod -f mongodb.conf &       # 開啓服務

3、登錄

進入安裝mongo的目錄

./mongo

use db_name

db.auth('user', 'passwd')

show collections

4、mongo與Elasticsearch使用簡易對比:

  • 有好多類似的特點,查詢大量數據的時候,返回的對象會是一個迭代器,例如es中的helpers、mongo中的find_many;需要循環才能拿出來數據,這個也是爲了節省系統資源而設計的,如果返回大量的數據到內存中,可能系統一下就會卡到爆,此處有個點需要考慮,如果自己封裝一個可以下載文件或者獲取大量數據的API,1、是否可以在返回數據的時候以迭代器的形式返回,從而節省系統資源,加快系統反應速度?2、如果查詢的大量數據要進行二次數據過濾,這個使用for循環是不是同樣會面對將大量的數據加載到內存中呢?此處考慮在接口內部封裝一個過濾數據的迭代器函數,這樣就不會全部將數據加載到內存中進行過濾;提示一下使用閉包可以實現,此處值得讀者考慮;查詢少量數據的話,返回的對象則爲list或者單個數據對象,列入ES中的search和mongo中的find。
  • ES查詢需要按照DSL格式封裝字典,進行查詢;mongo查詢只需要按照python字典的讀取數據格式進行查詢就可以
  • ES在性能方面關鍵字索引,模糊索引,分詞索引等更勝一籌,但是mongoDB在數據入庫方面更勝一籌,所以在設計內部數據存儲與讀取的時候,可以設計成mongoDB入數據,將mongo中的數據定時同步到ES,ES只負責查詢數據。

5、python操作mongo

mongo基本操作總結 

mongo的基本操作全面總結

  • 根據條件批量刪除
from pymongo import MongoClient

coll_name = ''
try:
	conn = MongoClient(host=MONGODB_HOST,
					   port=MONGODB_PORT)
	db = conn[MONGODB_DB_MERGE]
	db.authenticate(name=MONGODB_USERNAME, password=MONGODB_PASSWD)   # 用戶授權
except Exception as e:
	logger.error(str(e))
else:
	try:
		collection = db[coll_name]
		results = collection.delete_many(filter={'data.id': {'$in': ids}})  # 如果遇到查詢數據是字典中嵌套字典,需要使用.讀取,$in爲任意一個滿足即可
	except Exception as e:
		logger.error(str(e))
	else:
		if not results.acknowledged:  # 刪除結果,bool變量
			message = 'mongodb delete data failed'
		else:
			logger.info('mongo delete success, id is {}'.format(','.join(ids)))
  • 根據條件批量更新
"""
    func: 查詢集合中存在_source.expi_date字段,並且該字段的日期小於當前日期的數據、
    _source.revok字段的值爲False,將查詢到的數據revok字段全部更新爲True
"""

from pymongo import MongoClient

coll_names = ['coll1', 'coll2']
now_time = get_now_time()

filter_query = {
	'_source.expi_date': {'$exists': True, '$lte': now_time},
	'_source.revok': False,
}

update_doc = {
	'$set': {'_source.revok': True}
}

try:
	conn = MongoClient(host='host',
					   port='port')
	db = conn['db_name']
	db.authenticate(name='db_username', password='db_passwd')
except Exception as e:
    print(e)
else:
	for coll_name in coll_names:
		try:
			collection = db[coll_name]
			collection.update_many(filter=filter_query, update=update_doc)
		except Exception as e:
		    print(e)

	conn.close()

操作符:

符號 表示 含義 示例
: = 等於 {“age”: 20}
$lt < 小於 {“age”: {“$lt”: 20}}
$gt > 大於 {“age”: {“$gt”: 20}}
$lte <= 小於等於 {“age”: {“$lte”: 20}}
$gte >= 大於等於 {“age”: {“$gte”: 20}}
$ne != 不等於 {“age”: {“$ne”: 20}}
$in in 範圍內 {“age”: {“$in”: [20, 30]}}
$nin not in 不在範圍內 {“age”: {“$nin”: [20, 30]}}

功能符號:

符號 含義 示例 示例說明
$regex 匹配正則表達式 {“name”: {“$regex”: “^M.*”}} name以M開頭
$exists 屬性是否存在 {“name”: {“$exists”: True}} name屬性存在
$type 類型判斷 {“age”: {“$type”: “int”}} age的類型爲int
$mod 數字模操作 {“age”: {“$mod”: [5, 0]}} 年齡模5餘0
$text 文本查詢 {“text”: {“$search”: “Mike”}} text類型的屬性中包含字符串Mike
$where 高級條件查詢 {“name”: {“$where”: “obj.age==obj.count”}} 自身年齡等於自身數量

regex模糊搜索詳細參照此鏈接:模糊查詢條件介紹

$or 與 $and 的使用如下列舉:

{
    '$or': [{                           # 以下兩個模糊匹配條件滿足一個即可
        'source.vables.value': {
            '$exists': True,            # 判斷該字段存在的情況下才進行查詢
            '$options': 'i',            # 模糊查詢忽略大小寫
            '$regex': '.*bins/owari.*'  # 模糊查詢
        }
    }, {
        'source.vables.hashes.md5': {
            '$exists': True,
            '$options': 'i',
            '$regex': '.*bins/owari.*'
        }
    }], 
    'source.categs': {
        '$in': ['url', 'domain']
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章