Python3中使用MongoDB

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值