笔记-python lib-pymongo
1. 开始
pymongo是python版的连接库,最新版为3.7.2。
文档地址:https://pypi.org/project/pymongo/
使用文档:http://api.mongodb.com/python/current/tutorial.html
The PyMongo distribution contains tools for interacting with MongoDB database from Python. The bsonpackage is an implementation of the BSON format for Python. The pymongo package is a native Python driver for MongoDB. The gridfs package is a gridfs implementation on top of pymongo.
PyMongo supports MongoDB 2.6, 3.0, 3.2, 3.4, 3.6 and 4.0.
1.1. 安装
python –m pip isntall pymongo
1.2. 问题
使用ip始终连接不上,可能是在mongodb的设置中被绑定到127.0.0.1上了,使用localhost连接成功。
1.3. 常用操作
# pymongodb 常用操作
import pymongo
import time
import string
# 数据库相关信息
mongodb_info = ['192.168.199.113', 27017]
# 1. connect to mongodb,get database, get collection
"""
连接MongoDB我们需要使用PyMongo库里面的MongoClient,一般来说传入MongoDB的IP及端口即可,第一个参数为地址host,
第二个参数为端口port,端口如果不传默认是27017。
client = MongoClient('localhost', 27017)
第一个参数还可以传mongodb的连接字符串,
client = MongoClient('mongodb://localhost:27017/')可以达到同样的连接效果。
"""
conn = pymongo.MongoClient('localhost')
# 指明database,如果不存在则创建
# 也可以写为db = conn['test_database']
db = conn.test_database
# db1 = conn.a仅代表a而不代表a所指向的变量,下面会创建名为a的database而非aaa
#a = 'aaa'
#db1 = conn.a
# 指定collection
# 在指定collection名时也是如此,下面的语句会创建a而不是aaa
# 类似的,也可以写作coll = db['a']
coll = db.a
coll_test = db.test
#coll.insert({'rt':452423})
'''
# 3.集合管理
# 新增一个集合a
new_coll = db.a
# 注意,这时并没有创建集合,只有在插入数据时才会创建
# 删除集合
coll_2 = db.test_delete
result = coll_2.insert({'delete_test':'delete the collection'})
print(result)
db.drop_collection('test_delete')
# 查询所有集合
db_coll_name = db.collection_names(include_system_collections=False)
print(db_coll_name)
'''
# 实验环境创建
'''
chars = string.ascii_lowercase
li = [{chars[x]:x} for x in range(26)]
print(li)
coll_test = db.test
db.drop_collection('test')
coll_test.insert_one({'x':6}) # 自动生成_id
for i,j in enumerate(li):
coll_test.insert_one({'_id':i,**j}) # 指定_id
'''
'''
# 4. 数据操作
# 插入,每条数据有一个_id属性来唯一标识,如果没有显示指定,mongodb会自动生成一个
# 重复执行多次会插入多次
# insert 会返回_id
result = coll.insert({'key1':'sam','key2':'jack'})
print(result)
# 一次插入多条记录,记录以列表方式组织,列表每个元素代表一个记录
# 返回的结果是对应的_id的集合
# 在3.0版以后,官方推荐使用insert_one() and insert_many(),当然insert()也可以继续使用
#result = collection.insert([student1, student2])
# insert_one()
# 它返回的是一个pymongo.results.InsertOneResult对象,可以使用inserted_id获取_id
result = coll.insert_one({'insert_one':'1'})
print(result)
print(result.inserted_id)
# insert_many()
#
# 2.2 删除document
# 老版本的是remove,新版推荐使用delete_one
# 删除一个文档,如果该文档不存在,不会报错
# 没有指定参数则会删除前面的一个文档
print(coll_test.count_documents({}))
result = coll_test.delete_one({})
print(result.deleted_count)
# delete_many()
# 删除所有符合条件的文档
# 另外PyMongo还提供了一些组合方法,如find_one_and_delete()、find_one_and_replace()、find_one_and_update(),
# 就是查找后删除、替换、更新操作,用法与上述方法基本一致。
'''
# 2.3 修改
item = coll_test.find_one({'a':100})
print(item)
item['a'] = 200
result = coll_test.update({'a':100},item)
#result = coll_test.find_one_and_replace({'a':0},{'a':100})
print(result)
# 输出:{'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}
# 返回结果是字典形式,ok即代表执行成功,nModified代表影响的数据条数。
# 另外update()方法其实也是官方不推荐使用的方法,在这里也分了update_one()方法和update_many()方法,用法更加严格,
'''
# 2.4 查
# 集合数据
# 统计集合中文档的数量
# count_documents({})
doc_nums = coll.count_documents({})
print(doc_nums)
# 2.4.2 查询文档
# find_one() 获取一个collection
# 返回字典
# {'_id': ObjectId('5c162016e771231e84d078bf'), 'key1': 'sam', 'key2': 'jack'}
# _id是自动添加的字段
result = coll.find_one({'key1':'sam'})
# find()获取多个document 返回一个cursor对象
result = coll.find()
print(result) # <pymongo.cursor.Cursor object at 0x000000A566BD8C18>
# 打印所有满足条件的document
for _ in coll.find():
# print(type(_)) # <class 'dict'>
print(_)
# 根据objectid查询
# 注意,系统自动生成的id是一个对象而不是字符串
id = '5c162008e771231f0c96c0fa'
result = coll.find_one({'_id':id})
# 做一下类型转换
from bson.objectid import ObjectId
result = coll.find_one({'_id':ObjectId('5c162008e771231f0c96c0fa')})
print(result)
# 如果自己给定了_id 当然可以了
result = coll_test.find_one({'_id':4})
print(result)
# 条件查询
#d = [{'name':'a','age':15},{'name':'b','age':18},{'name':'c','age':23},{'name':'d','age':33}]
#coll_test.insert_many(d)
# 各数据库差不多,注意语法即可
result = coll_test.find({'age':{'$lt':20}})
print(list(result))
# 在这里将比较符号归纳如下表:
"""
符号含义示例
$lt小于{'age': {'$lt': 20}}
$gt大于{'age': {'$gt': 20}}
$lte小于等于{'age': {'$lte': 20}}
$gte大于等于{'age': {'$gte': 20}}
$ne不等于{'age': {'$ne': 20}}
$in在范围内{'age': {'$in': [20, 23]}}
$nin不在范围内{'age': {'$nin': [20, 23]}}
"""
# 正则也可以
results = collection.find({'name': {'$regex': '^M.*'}})
# 在这里使用了$regex来指定正则匹配,^M.*代表以M开头的正则表达式,这样就可以查询所有符合该正则的结果。
# 在这里将一些功能符号再归类如下:
"""
符号含义示例示例含义
$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高级条件查询{'$where': 'obj.fans_count == obj.follows_count'}自身粉丝数等于关注数
"""
# 这些操作的更详细用法在可以在MongoDB官方文档找到:
# https://docs.mongodb.com/manual/reference/operator/query/
# 计数
count = coll_test.find().count()
print(count)
print(coll_test.count_documents({}))
# 排序
result = coll_test.find().sort('name',pymongo.ASCENDING)
print(list(result))
'''