MongoDB学习笔记--Python篇

上篇我们是使用MongoDB的终端学习了基本的增删改查,这个小节我们结合Python来学习下。

安装pymongo

1
pip install pymongo -i https://pypi.douban.com/simple

连接数据库:

连接到数据库有三种方式

方式一:简写

1
client = MongoClient()

方法二:指定端口和地址

1
client = MongoClient('localhost', 27017)

方法三:使用URI

1
client = MongoClient('mongodb://localhost:27017/')

下面我们在ipython的命令行下演示代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
In [1]: from pymongo import  MongoClient

In [2]: client = MongoClient()

In [3]: dir(client)
Out[3]:
['HOST',
'PORT',
'address',
'arbiters',
'close',
'close_cursor',
'codec_options',
'database_names',
'drop_database',
'event_listeners',
'fsync',
'get_database',
'get_default_database',
'is_locked',
'is_mongos',
'is_primary',
'kill_cursors',
'list_database_names',
'list_databases',
'local_threshold_ms',
'max_bson_size',
'max_idle_time_ms',
'max_message_size',
'max_pool_size',
'max_write_batch_size',
'min_pool_size',
'next',
'nodes',
'primary',
'read_concern',
'read_preference',
'retry_writes',
'secondaries',
'server_info',
'server_selection_timeout',
'set_cursor_manager',
'start_session',
'unlock',
'watch',
'write_concern']

上面我打印出了client建立连接后所具有的属性。

1
2
3
4
5
6
7
8
9
10
11
# 查看连接的端口
In [4]: client.PORT
Out[4]: 27017

# 地址
In [5]: client.address
Out[5]: ('localhost', 27017)

# 查看连接具有的数据库
In [9]: client.list_database_names()
Out[9]: ['admin', 'config', 'local', 'sqlreview', 'students', 'test']

切换数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 切换到数据库 可以直接使用 点 进行切换
In [10]: db = client.students

# 也可以以字典的形式
In [11]: db = client['students']

In [12]: dir(db)
Out[12]:
[
'add_son_manipulator',
'add_user',
'authenticate',
'client',
'codec_options',
'collection_names',
'command',
'create_collection',
'current_op',
'dereference',
'drop_collection',
'error',
'eval',
'get_collection',
'incoming_copying_manipulators',
'incoming_manipulators',
'last_status',
'list_collection_names',
'list_collections',
'logout',
'name',
'next',
'outgoing_copying_manipulators',
'outgoing_manipulators',
'previous_error',
'profiling_info',
'profiling_level',
'read_concern',
'read_preference',
'remove_user',
'reset_error_history',
'set_profiling_level',
'system_js',
'validate_collection',
'watch',
'write_concern']
使用python 操作 mongodb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
from datetime import datetime
from pymongo import MongoClient
from bson.objectid import ObjectId


class TestMongo(object):

def __init__(self):
self.client = MongoClient()
self.db = self.client['blog']

def add_one(self):
"""新增数据"""
post = {
'title': '新的标题',
'content': '博客内容,....',
'author': 'ctt',
'created_at': datetime.now()
}
return self.db.blog.posts.insert_one(post)

def get_one(self):
"""查询一条数据"""
return self.db.blog.posts.find_one()

def get_more(self):
"""查询多条数据"""
return self.db.blog.posts.find({'author': 'ctt'})

def get_one_from_oid(self, oid):
"""查询指定ID的数据"""
obj = ObjectId(oid) # 返回一个对象类型 必须通过这种方式查找
return self.db.blog.posts.find_one({'_id': obj})

def update(self):
"""修改数据"""
# 修改一条数据
# rest = self.db.blog.posts.update_one({'author': 'ctt'}, {'$set': {'author': 'ttc'}})
# return rest
# 修改多条数据
return self.db.blog.posts.update_many({}, {'$set': {'author': 'ttc'}})

def delete(self):
"""删除数据"""
# 删除一条数据
# return self.db.blog.posts.delete_one({'author': 'ttc'})
# 删除多条数据
return self.db.blog.posts.delete_many({'author': 'ttc'})


if __name__ == '__main__':
mongo_obj = TestMongo()
# add_result = mongo_obj.add_one()
# print(add_result.inserted_id)

# query_result = mongo_obj.get_one()
# print(type(query_result))
# print(query_result["_id"])

# query_result = mongo_obj.get_more()
# print(query_result)
# for item in query_result:
# print(item['author'])

# query_result = mongo_obj.get_one_from_oid("5c079fb283a424bfff6e5e33")
# print(query_result)

# update_result = mongo_obj.update()
# print(update_result.matched_count) 查找到的条数
# print(update_result.modified_count) 影响的条数

delete_reult = mongo_obj.delete()
print(delete_reult.deleted_count)

Note that documents can contain native Python types (like datetime.datetime instances) which will be automatically converted to and from the appropriate BSON types.

MongoDB ODM

MongoEngine官方文档

安装

1
pip install mongoengine

连接

1
2
3
4
5
6
7
8
9
from mongoengine import connect
# 简写
connect('project1') # 默认连接到本地

# 指定 IP 和 端口
connect('project1', host='192.168.1.35', port=12345) # 连接到远程

# 使用URI
connect('project1', host='mongodb://localhost/database_name')

使用

1
2
3
4
5
6
from mongoengine import *
import datetime

class Page(Document):
title = StringField(max_length=200, required=True)
date_modified = DateTimeField(default=datetime.datetime.utcnow)

我们看下有哪些常用的字段类型: 字段

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
from datetime import datetime
from mongoengine import *

# connect('students')
# connect('students', host='192.168.1.35', port=27017)
connect('students', host='mongodb://localhost/students')


class Grade(EmbeddedDocument):
"""学生的成绩"""
name = StringField(required=True)
score = FloatField(required=True)


SEX_CHOICES = (
('female', '女'),
('male', '男')
)


class Student(Document):
"""学生模型"""
name = StringField(required=True, max_lenght=32)
age = IntField(required=True)
sex = StringField(required=True, choices=SEX_CHOICES)
grade = FloatField()
created_at = DateTimeField(default=datetime.now())
grades = ListField(EmbeddedDocumentField(Grade))
address = StringField()
school = StringField()

# 我们需要指定集合的名字 如果没有指定的话 将会新建一个类的小写名字的集合
meta = {
'collection': 'students',
'ordering': ['-age'] # - 倒序 + 升序
}


class TestMongoEngine(object):

def add_one(self):
"""新增数据"""
yuwen = Grade(
name='语文',
score=98
)
english = Grade(
name='英语',
score=79)
stu_obj = Student(
name='天天',
age=21,
sex='male',
grades=[yuwen, english]
)
# 如果我们继承的是动态文档 DynamicDocument 则是可以使用在类中没有定义的字段
# 但是 如果我们使用的不是动态文档 则不可
# stu_obj.test = 'OK'
stu_obj.save()
return stu_obj

def get_one(self):
"""查询一条数据"""
# Student.objects 返回的是一个 query_set 查询集 类比于 Django ORM
return Student.objects.first()

def get_more(self):
"""查询多条数据"""
# return Student.objects
return Student.objects.all()

def get_one_from_oid(self, oid):
"""查询指定ID的数据"""
# 根据 id 查找 不用再转换
# 如果使用 get 方式 类比其他ORM 查询到多个就会返回错误 推荐filter
return Student.objects.filter(id=oid).first()

def update(self):
"""修改数据"""
# 修改一条数据
# rest = Student.objects.filter(sex='male').update_one(inc__age=1)

# 修改多条数据
rest = Student.objects.filter(sex='male').update(inc__age=1)
return rest

def delete(self):
"""删除数据"""
# 删除一条数据
# rest = Student.objects.filter(sex='male').first().delete()
# 删除多条数据
rest = Student.objects.filter(sex='male').delete()
return rest


if __name__ == '__main__':
obj = TestMongoEngine()

# add_result = obj.add_one()
# # pk 为主键 _id 同样可以使用 id获得主键
# print(add_result.pk)

# query_result = obj.get_one()
# # 返回的是一个对象 不再是字典 可以通过 点的方式查到属性
# print(query_result.name)

# query_result = obj.get_more()
# for item in query_result:
# print(item.name)

# query_result = obj.get_one_from_oid('5c07db2b83a424c83d068aca')
# print(query_result.name)

# query_result = Student.objects.order_by("+age").first()
# print(query_result.name)

# update_result = obj.update()
# print(update_result)

delete_result = obj.delete()
print(delete_result)

第一次了解到ODM,希望以后有机会在工作中使用到😊😊

推荐扩展阅读:开发者需要了解的MongoDB知识点

知识就是财富
如果您觉得文章对您有帮助, 欢迎请我喝杯水!