Django关于mangodb的使用

Django+Mongo

​:point_right: 安装需要的包

在django中要使用模型就需要使用mongoengine

因此安装 pip3 install mongoengine==0.16.0

:point_right:settings配置

django官方文档没有包含mongodb使用说明,按照下面修改就能使连接到mongodb

1
2
3
4
5
6
7
8
9
10
DATABASES = {
'default': {
'ENGINE': None,
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
from mongoengine import connect
connect('django')
# 注: django是数据库名

:point_right:简单的models.py

1
2
3
4
5
6
7
8
import mongoengine

class MongoDjangoTest(mongoengine.Document):
name = mongoengine.StringField(max_length=20)
content = mongoengine.StringField(max_length=100)

# 指定连接mongo数据库对应的集合名(表名), 即test2就是表名, 如果不指定就是模型名的小写
meta = {'collection':'test2'}

:point_right:增删改查

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
from django.http import request, HttpResponse

from app.models import MongoDjangoTest

def add_data(request):
if request.method == 'GET':
test1 = MongoDjangoTest()
test1.name = 'test1'
test1.content = 'WOWOWOWOOOWOWOWOW'
test1.save()
return HttpResponse('success')

def remove_data(request):
if request.method == 'GET':
MongoDjangoTest.objects.filter(name='test1').delete()
return HttpResponse('success')

def query_data(request):
if request.method == 'GET':
mongos = MongoDjangoTest.objects.all()
print(mongos)
return HttpResponse(mongos)

def update_data(request):
if request.method == 'GET':
mongos = MongoDjangoTest.objects.filter(name='test1').update(content='update data')
return HttpResponse('success')

​:closed_lock_with_key: 使用mongoengine建立的模型后,其操作数据库表使用方式与其他数据库(mysql, postgresql)的方式差不多

Mongo

mongo将数据插入到collection集合中, 而插入的数据又被称为document文档.

文档的数据结构和JSON基本一样。

所有存储在集合中的数据都是BSON格式。

BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON。

数据库(mangodb shell)

​:point_right: 连接数据库

1
2
3
4
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

# 使用用户名和密码连接登录到本地的mongo指定test数据库
mogondb://root:123456@localhost/test

​:point_right: 使用数据库,若数据库不存在就创建

use db_name

其他更多的可以看菜鸟教程

pymango

:point_right:1 .简单使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# pip3 install pymango
from pymango import MangoClient

# 自定义端口和地址(默认本地127.0.0.1,端口27017)
# client = MangoClient('mangodb://127.0.0.1:27019') 或者
# client = pymongo.MongoClient(host='localhost', port=27017)
client = MangoClient()

# 连接数据库, 假设数据库名为db_name
# db = client['db_name'] 或者
db = client.db_name

# 连接到数据集(即表), 假设数据集名为dataset
# coll = db['dataset']
coll = db.dataset

:point_right:2 .插入数据

1
2
3
4
5
6
7
8
9
10
11
12
# 插入单条数据, coll_name是数据集名, document是bson格式的数据, doucments就是数据序列
db.coll_name.insert_one(document)
#eg:
document = db.student.insert_one({
'name': 'lisa',
'age': 21,
'scores': [{'subject': 'chinese', 'grade': 90},
{'subject': 'mathematic', 'grade': 80}]

})

db.coll_name.insert_many(documents)

:point_right:3 .查询数据

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
# 查询数据
'''
find(filter=None, projection=None, skip=0, limit=0, no_cursor_timeout=False,
cursor_type=CursorType.NON_TAILABLE, sort=None, allow_partial_results=False,
oplog_replay=False, modifiers=None, manipulate=True)

'''
# 查询出来的是一个列表集合
documents = db.coll_name.find()
for document in documents:
print(document)

# 查询出来的是一个数据
# find_one(filter_or_id=None, *args, **kwargs)
document = db.coll_name.find_one()

# 通过id来查询, 需要引入bson库中的ObjectId
from bson.objectid import ObjectId
result = collection.find_one({'_id': ObjectId('593278c115c2602667ec6bae')})

# 查询最外层数据
db.student.find({'name':'lisa'})

# 查询内层嵌套的数据
db.student.find({'scores.subject': 'chinese'})

# 操作符查询
# 若是有满足条件就能查到, 如下面四个都能查到
# gt大于 gte大于等于
db.student.find({'scores.grade':{'$gt':85}})
# lt小于 lte小于等于
db.student.find({'scores.grade':{'$lt':85}})
# in在范围里
db.student.find({'scores.grade':{'$lt':[80, 85]}})
# nin不再范围里
db.student.find({'scores.grade':{'$lt':[80, 85]}})

# 正则表达式,
db.student.find({'name':{'$regex':'^l.*'}})

# 其他符号查询
# name属性存在
db.student.find({'name':{'$exists':True}})
# age的类型为int
db.student.find({'age':{'$type':'int'}})
# age模4余1
db.student.find({'age':{'$mod':[4, 1]}})
# text类型的属性中包含he字符串
db.student.find({'$text':{'$search':'he'}})

# 计数
count = db.student.find().count()

# 排序
# 传入排序的字段升序排列, 降序为DESCENDING, 升序ASCENDING, 得到的results是列表
results = db.student.find().sort('name', pymango.ASCENDING)
# 偏移2, 即忽略两个元素
results = db.student.find().sort('name', pymango.ASCENDING).skip(2)
# 忽略2个元素后再限制得到3个元素
results = db.student.find().sort('name', pymango.ASCENDING).skip(2).limit(3)

:point_right:4 .更新数据

1
2
3
4
5
6
7
8
9
10
11
12
13
# 方式一, 修改其字段, 再更新(原条件, 修改后的数据)
condition = {'name': 'lisa'}
stu = db.student.find_one(condition)
stu['age'] = 25
result = db.student.update(condition, stu)
#注意, 不能直接更新它的某个字段, 它不直接使数据只有这一个更新后的字段, 其他字段就没了哦

# 上述的内容, 也可以使用update_one条件更苛刻
result = db.student.update_one(condition, {'$set': stu})

# update_many更新多条(对年龄大于10的数据, 修改其年龄为30)
condition = {'age': {'$gt': 10}}
result = db.student.update_many(condition, {'$inc': {'age':30}})

:point_right:5 .删除数据

1
2
3
4
5
6
7
8
# remove()删除指定的条件
result = db.student.remove({'name':'lisa'})

# delete_one()删除一个数据
result = db.student.delete_one({'name':'lisa'})

# delete_many()删除多条数据
result = db.student.delete_many({'age':{'$gt':10}})

:point_right:6 .组合方法

1
find_one_and_delete()、find_one_and_replace()、find_one_and_update()

各版本数据库端口

:point_right:1 .关系型数据库:
Oracle数据库默认状态下:端口号为,1521
MySQL数据库默认状态下:端口号为,3306
SQLServer数据库默认状态下:端口号为,1433

:point_right:2 .NOSQL数据库:
MongoDB默认状态下的端口号为:27017
Redis默认状态下的端口号为:6379
memcached默认状态下的端口号为:11211

-------------end-------------
0%