1、MongoDB简介
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。在Python中则是使用pymongo库。
2、安装pymongo
使用pip安装pymongo:
pip install pymongo
注:
(1)当通过“pip install pymongo”安装的pymongo在anaconda中无法使用时使用“conda install -c https://conda.binstar.org/anaconda pymongo”来安装。
(2)在pycharm中无法导入pymongo时,可以使用pycharm的提示工具来安装pymongo。
3、链接MongoDB
client=pymongo.MongoClient(host='localhost',port=27017)
# 或者
client=pymongo.MongoClient('mongodb://localhost:27017/')
4、指定数据库
db=client['dba']
# 或者
db=client.dba
注:
在 MongoDB 中,数据库只有在内容插入后才会创建! 就是说,数据库创建后要创建集合(数据表)并插入一个文档(记录),数据库才会真正创建。
5、指定集合(数据表)
collection=db['dba']
# 或者
collection=db.dba
6、插入
插入单条数据
student = {
'id':1,
'name':'zhangsan',
'age':18,
}
result = collection.insert(student)
插入多条数据
studentmany = [
{'id':2, 'name':'lisi','age':22},
{'id':3, 'name':'wangwu','age':19}
]
result = collection.insert(studentmany)
注:
每次执行后都将插入一条新数据,每条数据系统都会为其生成一个唯一的“ObjectId”,因此会重复插入数据。
pycharm中注释多行代码快捷键:代码选中的条件下,同时按住 Ctrl+/,被选中行被注释;再次按下Ctrl+/,注释被取消。
7、查询
(1)按条件查询
result = collection.find_one({'name':'zhangsan'})
print(result)
print(type(result)) # 返回字典类型
结果:
{'_id': ObjectId('5d6245c2935396795b12288f'), 'id': 1, 'name': 'zhangsan', 'age': 18}
<class 'dict'>
(2)查询多条数据
resultmany = collection.find()
for i in resultmany:
print(i)
结果:
{'_id': ObjectId('5d6245c2935396795b12288f'), 'id': 1, 'name': 'zhangsan', 'age': 18}
{'_id': ObjectId('5d6248b21de1f7a3416cb2f5'), 'id': 2, 'name': 'lisi', 'age': 22}
{'_id': ObjectId('5d6248b21de1f7a3416cb2f6'), 'id': 3, 'name': 'wangwu', 'age': 19}
(3)过滤查询匹配的文档
resultfitet = collection.find({'age':{'$gt':18}})
for i in resultfitet:
print(i)
结果:
{'_id': ObjectId('5d6248b21de1f7a3416cb2f5'), 'id': 2, 'name': 'lisi', 'age': 22}
{'_id': ObjectId('5d6248b21de1f7a3416cb2f6'), 'id': 3, 'name': 'wangwu', 'age': 19}
注:
(1)比较符号还有:$lt小于、$gt大于、$lte小于等于、$gte大于等于、$ne不等于、$in在范围内、$nin不在范围内。
(2)正则表达式$regex:
result = collection.find({'name': {'$regex': '^z.*'}}) # 以“z”开头的字符串
(3)其他功能符号:$exists属性是否存在、$type类型判断、$mod数字余数、$text文本查询、$shere条件查询。
更多详细用法可以在MongoDB官网找到:https://docs.mongodb.com/manual/reference/operator/query/
8、计数
count = collection.find().count() # 计算全部数量
count = collection.count_documents({'age':18}) # 按条件计数
count = collection.find({'age':22}).count()
print(count)
9、排序
只用sort()排序,pymongo.DESCENDIN降序,pymongo.ASCENDING升序。
results = collection.find().sort('name', pymongo.DESCENDING)
results = collection.find().sort('age', pymongo.ASCENDING)
for i in results:
print(i)
注:当使用find()返回多个结果时需要遍历才能打印出各个结果,否则将只返回游标的地址。
结果:
{'_id': ObjectId('5d6245c2935396795b12288f'), 'id': 1, 'name': 'zhangsan', 'age': 18}
{'_id': ObjectId('5d6248b21de1f7a3416cb2f6'), 'id': 3, 'name': 'wangwu', 'age': 19}
{'_id': ObjectId('5d6248b21de1f7a3416cb2f5'), 'id': 2, 'name': 'lisi', 'age': 22}
10、偏移
使用skip()偏移位置来忽略前面的元素。
results = collection.find().sort('age', pymongo.ASCENDING).skip(1)
for i in results:
print(i)
结果:
{'_id': ObjectId('5d6248b21de1f7a3416cb2f6'), 'id': 3, 'name': 'wangwu', 'age': 19}
{'_id': ObjectId('5d6248b21de1f7a3416cb2f5'), 'id': 2, 'name': 'lisi', 'age': 22}
使用limit()指定要取的结果个数
results = collection.find().sort('age', pymongo.ASCENDING).skip(1).limit(1) # 只取结果中的第一个
11、更新
(1)update()
可以使用update()更新数据,但是不够安全,该方法会将除了_id和要更新数据外的其他字段都删除。
result = collection.update({'age':18},{'age':88})
# 会将age=18的更新为88,但是同时会把原来字段的name和id删除
(2)$set
使用$set会更安全,该方法只更新存在文档内存的字段。
result = collection.update({'age':88},{'$set':{'age':28}})
#只更新age字段
(3)官方推荐使用update_one()和update_many()方法,来严格控制影响的字段,它需要使用$类型的操作字符来作为字典的键名。
result = collection.update_one({'name':'zhangsan'},{'$set':{'age':68}})
result = collection.update_many({'age':{'$lt': 50}}, {'$inc':{'age':10}})
# 打印匹配的数据条数和受影响的数据条数
print(result.matched_count, result.modified_count)
12、删除
remove():删除所有符合条件数据
delete_one():删除符合条件的第一条数据
delete_many():删除所有符合条件的数据
result = collection.remove({'name':'zhangsan'})
result = collection.delete_one({'name':'zhangsan'})
result = collection.delete_many({'age':{'$gt': 30}})
13、其他操作
find_one_and_delete() 查找后删除
find_one_and_replace() 查找后替换
find_one_and_update() 查找后更新
create_index() 在集合上创建索引
create_indexes() 在集合上创建一个或多个索引
drop_index() 删除此集合上的索引
更多集合操作方法:http://api.mongodb.com/python/current/api/pymongo/collection.html
pymongo的API文档:http://api.mongodb.com/python/current/api/pymongo/index.html
参考:https://www.cnblogs.com/zhangxinqi/p/9242687.html