文档章节

mongoengine 使用介绍

FenG_Vnc
 FenG_Vnc
发布于 2017/03/03 15:08
字数 939
阅读 140
收藏 0

介绍

mongoengine是一个基于mongodb封装的ORM引擎。它提供了一个类似SQLALCHEMY一样的语法来操作mongodb数据库

安装方法

pip install mogoengine

基本使用

from mongoengine import *
from datetime import datetime
# 连接数据库
connect('blog') # 连接本地blog数据库
# 如需验证和指定主机名
# connect('blog', host='192.168.3.1', username='root', password='1234')
 
# 定义分类文档
class Categories(Document):
 ' 继承Document类,为普通文档 '
 name = StringField(max_length=30, required=True)
 artnum = IntField(default=0, required=True)
 date = DateTimeField(default=datetime.now(), required=True)

插入

cate = Categories(name="Linux") # 如果required为True则必须赋予初始值,如果有default,赋予初始值则使用默认值
cate.save() # 保存到数据库

查询和更新

文档类有一个 objects 属性.我们使用它来查询数据库.

# 返回集合里的所有文档对象的列表
cate = Categories.objects.all()
 
# 返回所有符合查询条件的结果的文档对象列表
cate = Categories.objects(name="Python")
# 更新查询到的文档:
cate.name = "LinuxZen"
cate.update()

查询数组 默认查询数组"="代表的意思是in:

class Posts(Document):
 artid = IntField(required=True)
 title = StringField(max_length=100, required=True)
 content = StringField(required=True)
 author = ReferenceField(User)
 tags = ListField(StringField(max_length=20, required=True), required=True)
 categories = ReferenceField(Categories), required=True)
 comments = IntField(default=0, required=True)
 
# 将会返回所有tags包含coding的文档
Posts.objects(tags='coding')

ReferenceField 引用字段: 通过引用字段可以通过文档直接获取引用字段引用的那个文档:

class Categories(Document):
 name = StringField(max_length=30, required=True)
 artnum = IntField(default=0, required=True)
 date = DateTimeField(default=datetime.now(), required=True)
 
class Posts(Document):
 
 title = StringField(max_length=100, required=True)
 content = StringField(required=True)
 tags = ListField(StringField(max_length=20, required=True), required=True)
 categories = ReferenceField(Categories)

插入引用字段

cate =Categories(name="Linux")
cate.save()
post = Posts(title="Linuxzen.com", content="Linuxzen.com",tags=["Linux","web"], categories=cate)
post.save()

通过引用字段直接获取引用文档对象

一般文档查询会返回一个列表(尽管只有一个结果),我们想要获得一个文档对象可以使用索引获取第一个文档对象,但是mongoengine建议使用first()来获取第一个:

>>> cate = Posts.objects.all().first().categories
>>> cate
 
>>> cate.name

查询包含Linux分类的文章

>>> cate = Categories.objects(name="Linux").first()
>>> Posts.objects(categories=cate)

EmbeddedDocument 嵌入文档

继承EmbeddedDocument的文档类就是嵌入文档,嵌入文档用于嵌入其他文档的EmbeddedDocumentField 字段,比如上面例子的tags字段如果改成嵌入文档的话可以将Posts文档类改成如下方式:

class Posts(Document):
 
 title = StringField(max_length=100, required=True)
 content = StringField(required=True)
 tags = ListField(EmbeddedDocumentField('Tags')required=True)
 categories = ReferenceField(Categories)

还需要添加一个Tags嵌入文档类:

class Tags(EmbeddedDocument):
name = StringField()
date = DateTimeField(default=datetime.now())

我们像如下方式插入Posts文档中的Tags

>>> tag = Tags(name="Linuxzen")
>>> post = Posts(title="Linuxzen.com", content="Linuxzen.com", tags=[tag], categories=cate)
>>> tag = Tags(name="mysite")
>>> post.tags.append(tag)
>>> post.save()
>>> tags = post.tags
>>> for tag in tags:
print tag.name
 
Linuxzen
mysite

时间段查询

start = datetime(int(year), int(month), 1)
if int(month) + 1 > 12:
 emonth = 1
 eyear = int(year) + 1
else:
 emonth = int(month) + 1
 eyear = int(year)
end = datetime(eyear, emonth, 1)
articles = Posts.objects(date__gte=start, date__lt=end).order_by('-date')

分片 slice用于分片

# comments - skip 5, limit 10
Page.objects.fields(slice__comments=[5, 10])
 
# 也可以使用索引值分片
 
# limit 5
users = User.objects[:5]
 
# skip 5
users = User.objects[5:]
 
# skip 10, limit 15
users = User.objects[10:15]

使用原始语句查询

如果想使用原始的pymongo查询方式可以使用__raw__操作符 Page.objects(raw={'tags':'coding'}) 使用$inc和$set操作符

# 更新嵌入文档comments字段by的值为joe的文档字段votes增加1
Page.objects(comments_by="joe").update(inc__votes=1)
 
# 更新嵌入文档comments字段by的值为joe的文档字段votes设置为1
Page.objects(comments_by="joe").update(set__votes=1)
 
其他技巧
 
#查询结果转换成字典
users_dict = User.objects().to_mongo()
 
# 排序,按日期排列
user = User.objects.order_by("date")
 
# 按日期倒序
 
user = User.objects.order_by("-date")

最后

官网文档对于这些都写的很好。所以都可以去看看。链接地址 http://docs.mongoengine.org/guide/defining-documents.html?highlight=choices

© 著作权归作者所有

FenG_Vnc
粉丝 11
博文 24
码字总数 11100
作品 0
深圳
其他
私信 提问
MongoEngine文档翻译__新手教程(一)安装MongoEngine&连接MongoDB

PS:非常不错的mongoengine新手教程 最近开始做一个Python + MongoDB的项目,用到了MongoEngine这个非常不错的ORM工具,我将MongoEngine的文档翻译一部分出来,与大家分享。 安装MongoEngine...

LeafSummer
2013/05/12
4.2K
0
Django操作NOSQL(MongoDB)数据库

每一个Django工程师在接触NOSQL数据库的时候,肯定都会思考一个问题:在Django中不能像操作普通的关系型数据库(以下简称RDB) 一样,操作NOSQL数据库吗?当然可以,Django工程师几乎不需要什么...

红薯
2012/03/05
1K
2
在 Django 中使用 MongoDB

每一个Django工程师在接触NOSQL数据库的时候,肯定都会思考一个问题:在Django中不能像操作普通的关系型数据库(以下简称RDB)一样,操作NOSQL数据库吗?当然可以,Django工程师几乎不需要什么...

岭南六少
2011/08/18
772
0
MongoEngine__新手教程(五)在django框架里使用mongodb

先很简单的创建一个django的工程(具体不说django), 然后弄个小app或者随便哪里写个view就好了. 然后我用了几步就确定它可以正常使用了. 首先修改settings.py, 原来DATABASES完全不用去管它了...

LeafSummer
2013/05/12
6K
2
Python中使用MongoEngine

pymongo来操作MongoDB数据库,但是直接把对于数据库的操作代码都写在脚本中,这会让应用的代码耦合性太强,而且不利于代码的优化管理 一般应用都是使用MVC框架来设计的,为了更好地维持MVC结...

鱼煎
2018/05/31
99
0

没有更多内容

加载失败,请刷新页面

加载更多

堆”和“栈

C++作为一款C语言的升级版本,具有非常强大的功能。它不但能够支持各种程序设计风格,而且还具有C语言的所有功能。我们在这里为大家介绍的是其中一个比较重要的内容,C++内存区域的基本介绍。...

SibylY
34分钟前
3
0
总结:Https

一、介绍 简单理解,https即在http协议的基础上,增加了SSL协议,保障数据传输的安全性。 它由以前的http—–>tcp,改为http——>SSL—–>tcp;https采用了共享密钥加密+公开密钥加密的方式 ...

浮躁的码农
36分钟前
4
0
数据库表与表之间的一对一、一对多、多对多关系

表1 foreign key 表2 多对一:表 1 的多条记录对应表 2 的一条记录 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以对应表2的一条记录 表2的多条记...

Garphy
今天
7
0
MySQL 表崩溃修复

MySQL日志报错 2019-10-19 13:41:51 19916 [ERROR] /usr/local/mysql/bin/mysqld: Table './initread_hss/user_info' is marked as crashed and should be repaired2019-10-19 13:41:51 1......

雁南飞丶
今天
6
0
Error和Exception

1.Error类和Exception类都是继承Throwable类 2.Error(错误)是系统中的错误,程序员是不能改变的和处理的,是在程序编译时出现的错误,只能通过修改程序才能修正。一般是指与虚拟机相关的问...

大瑞清_liurq
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部