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']
}
}