pymongo的使用
python3.7版本。
安装
大部分都从安装开始。
pip3 install pymongo
连接数据库
连接上mongo库(未认证)
In [1]: from pymongo import MongoClient
In [3]: client = MongoClient(host='10.251.1.162', port=28019)
In [4]: client
Out[4]: MongoClient(host=['10.251.1.162:28019'], document_class=dict, tz_aware=False, connect=True)
# connect为True表示已经连接上了库
现在登录的是Mongo的客户端相当于 mongo --host 10.251.1.162,并没有进行库的登录
现在我们不着急,可以dir下看下,其中包含了什么参数
一些默认值的介绍
'address', # 查看当前连接的地址
In [10]: client.address
Out[10]: ('10.251.1.162', 28019)
'arbiters', # 查看仲裁者
'close', # 关闭连接
'close_cursor',
'database_names', # 查看所有数据库的名字,这里需要进行认证后查看,否则会报 OperationFailure: command listDatabases requires authentication
'get_database', # 获取数据库,这里可以
In [22]: admin = client.get_database('admin') # 可以直接使用client.admin
'is_mongos', # 是否为mongo的mongos路由代理
In [27]: client.is_mongos
Out[27]: True # 这里我使用的就是mongos路由代理
'is_primary', # 是否为主节点
'list_database_names', # 等同于 database_names()
'max_pool_size', # 当前最大连接数
In [40]: client.max_pool_size
Out[40]: 100 # 所以表明默认有100个连接数
这里引入了一个问题,pymongo中max_pool_size是如何工作的?
Pymongo为线程安全的,(见官网)但不是进程安全的。
实例不能从父进程复制到子进程,父子进程必须有自己的MongoClient实例,否则会报警告。
具体就是:
- pymongo中有一个内置的线程池,默认值为100;
- max_pool_size 设置最大连接数, max_idle_time设置一个连接在连接池中保持空闲的最大毫秒数;
- waitQueueTimeoutMS 可以限制等待线程的数量;
数据库认证
- 连接前进行认证
In [41]: client = MongoClient(host='10.251.1.162', port=28019, username='root', password='12345', authSource='admin')
In [42]: client
Out[42]: MongoClient(host=['10.251.1.162:28019'], document_class=dict, tz_aware=False, connect=True, authsource='admin')
- 连接后进行认证
In [46]: client = MongoClient(host='10.251.1.162', port=28019)
In [47]: db = client.admin
In [48]: db
Out[48]: Database(MongoClient(host=['10.251.1.162:28019'], document_class=dict, tz_aware=False, connect=True), 'admin')
In [49]: db.authenticate('root', '12345')
Out[49]: True
增删查改
- 增加
# 增加一条数据
In [56]: db = client.test # 获取数据库
In [57]: col = db.test # 获取集合
In [58]: test = {'user': 'tangluoyan', 'age': 24} # 组织数据
In [59]: _id = col.insert_one(test).inserted_id() # 插入数据, 并返回object_id
# 增加多条数据
In [63]: items = []
In [64]: for i in range(3):
...: item = {'user': 'tangluoyan'+str(i), 'age': (24 + i)}
In [65]: for i in range(3):
...: item = {'user': 'tangluoyan'+str(i), 'age': (24 + i)}
...: items.append(item)
In [66]: result = col.insert_many(items)
In [68]: result.inserted_ids
Out[68]:
[ObjectId('5d55432d96b7626feef7ac9f'),
ObjectId('5d55432d96b7626feef7aca0'),
ObjectId('5d55432d96b7626feef7aca1')]
- 查找
查出匹配的第一个数据
In [69]: user = col.find_one()
In [70]: user
Out[70]: {'_id': ObjectId('5d5541f896b7626feef7ac9e'), 'user': 'tangluoyan', 'age': 24}
条件查询
In [77]: col.find_one({'user': 'tangluoyan1'})
Out[77]: {'_id': ObjectId('5d55432d96b7626feef7aca0'), 'user': 'tangluoyan1', 'age': 25}
使用ObjectId查询
In [78]: from bson import ObjectId
In [79]: col.find_one({'_id': ObjectId('5d55432d96b7626feef7aca0')})
Out[79]: {'_id': ObjectId('5d55432d96b7626feef7aca0'), 'user': 'tangluoyan1', 'age': 25}
未找到返回空
返回多个数据
In [82]: for item in col.find():
...: print(item)
{'_id': ObjectId('5d5541f896b7626feef7ac9e'), 'user': 'tangluoyan', 'age': 24}
{'_id': ObjectId('5d55432d96b7626feef7ac9f'), 'user': 'tangluoyan0', 'age': 24}
{'_id': ObjectId('5d55432d96b7626feef7aca0'), 'user': 'tangluoyan1', 'age': 25}
{'_id': ObjectId('5d55432d96b7626feef7aca1'), 'user': 'tangluoyan2', 'age': 26}
获取总数
In [86]: col.count_documents({})
Out[86]: 4
# {}中填写条件,必须要传
时间操作
# 如果时间是字符串可以使用一下方法
In [87]: from dateutil import parser
In [92]: col.insert_one({'user':'tangluoyan33', 'age': 25, 'insert_time': parser.parse('2019-01-02 00:00:01')})
Out[92]: <pymongo.results.InsertOneResult at 0x7f6f42943388>
# 查询
In [94]: col.find_one({'insert_time': {'$lt': datetime.now()}})
Out[94]:
{'_id': ObjectId('5d55470096b7626feef7aca2'),
'user': 'tangluoyan33',
'age': 25,
'insert_time': datetime.datetime(2019, 1, 2, 0, 0, 1)}
- 修改
In [96]: col.update_one({'user': 'tangluoyan'}, {'$set': {'age': 33}})
Out[96]: <pymongo.results.UpdateResult at 0x7f6f668d9308>
In [97]: col.find_one({'user': 'tangluoyan'})
Out[97]: {'_id': ObjectId('5d5541f896b7626feef7ac9e'), 'user': 'tangluoyan', 'age': 33}
Grid fs
连接
>>> from pymongo import MongoClient
>>> import gridfs
>>>
>>> db = MongoClient().gridfs_example #获取到数据库
>>> fs = gridfs.GridFS(db) #创建一个实例
插入并查询,更新
>>> b = fs.put(fs.get(a), filename="foo", bar="baz")
>>> out = fs.get(b)
>>> out.read()
'hello world'
>>> out.filename
u'foo'
>>> out.bar
u'baz'
>>> out.upload_date
datetime.datetime(...)