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

猜你喜欢

转载自blog.csdn.net/u012089823/article/details/88036976