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
- 根據條件批量刪除
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']
}
}