在Python中使用mongoengine操作MongoDB教程


Posted in Python onApril 24, 2015

最近重新拾起Django,但是Django并不支持mongodb,但是有一个模块mongoengine可以实现Django Model类似的封装.但是mongoengine的中文文档几乎没有,有的也是简短的几句介绍和使用.下面我就分享一下我在使用过程中所记录下的一些笔记,可能有点乱.大家可以参考一下.
安装mongoengine

easy_install pymongo # 依赖库
easy_install mongoengine

基本使用

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)

和Django的model使用很类似,所以也不解释什么.
插入

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

u'Linux'

查询包含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")

 

Python 相关文章推荐
python 换位密码算法的实例详解
Jul 19 Python
Python实现返回数组中第i小元素的方法示例
Dec 04 Python
Python字典数据对象拆分的简单实现方法
Dec 05 Python
tensorflow 加载部分变量的实例讲解
Jul 27 Python
Python设计模式之桥接模式原理与用法实例分析
Jan 10 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
Pandas中resample方法详解
Jul 02 Python
python3实现带多张图片、附件的邮件发送
Aug 10 Python
python自动化实现登录获取图片验证码功能
Nov 20 Python
Python+OpenCV实现旋转文本校正方式
Jan 09 Python
python统计字符的个数代码实例
Feb 07 Python
Django中日期时间型字段进行年月日时分秒分组统计
Nov 27 Python
python使用arp欺骗伪造网关的方法
Apr 24 #Python
python使用wxPython打开并播放wav文件的方法
Apr 24 #Python
python使用PyGame播放Midi和Mp3文件的方法
Apr 24 #Python
python使用PyGame绘制图像并保存为图片文件的方法
Apr 24 #Python
python使用PIL缩放网络图片并保存的方法
Apr 24 #Python
python使用Tkinter显示网络图片的方法
Apr 24 #Python
Python中最常用的操作列表的几种方法归纳
Apr 24 #Python
You might like
smarty模板局部缓存方法使用示例
2014/06/17 PHP
YII实现分页的方法
2014/07/09 PHP
ThinkPHP多语言支持与多模板支持概述
2014/08/22 PHP
推荐25款php中非常有用的类库
2014/09/29 PHP
PHP针对JSON操作实例分析
2015/01/12 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
JavaScript 构造函数 面相对象学习必备知识
2010/06/09 Javascript
DIV始终居中的js代码
2014/02/17 Javascript
js实现最短的XML格式化工具实例
2015/03/12 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
JavaScript中数组的合并以及排序实现示例
2015/10/24 Javascript
基于javascript实现随机颜色变化效果
2016/01/14 Javascript
简单理解Vue条件渲染
2016/12/03 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
python实现读取命令行参数的方法
2015/05/22 Python
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
印度在线购物网站:Paytmmall
2019/07/24 全球购物
优良学风班总结材料
2014/02/08 职场文书
竞选大队长演讲稿
2014/04/29 职场文书
开会通知短信大全
2015/04/20 职场文书
高中班主任心得体会
2016/01/07 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
python 利用 PIL 将数组值转成图片的实现
2021/04/12 Python
让文件路径提取变得更简单的Python Path库
2021/05/27 Python