在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实现计算两个时间之间相差天数的方法
May 10 Python
使用Kivy将python程序打包为apk文件
Jul 29 Python
Python+tkinter使用80行代码实现一个计算器实例
Jan 16 Python
python实现类之间的方法互相调用
Apr 29 Python
Python SMTP发送邮件遇到的一些问题及解决办法
Oct 24 Python
实例讲解Python脚本成为Windows中运行的exe文件
Jan 24 Python
Python3删除排序数组中重复项的方法分析
Jan 31 Python
Python配置虚拟环境图文步骤
May 20 Python
修改 CentOS 6.x 上默认Python的方法
Sep 06 Python
python将三维数组展开成二维数组的实现
Nov 30 Python
python实现密码验证合格程序的思路详解
Jun 01 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 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
德劲1102收音机的打理维修案例
2021/03/02 无线电
php获取网页上所有链接的方法
2015/04/03 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
php版微信自动登录并获取昵称的方法
2016/09/23 PHP
Yii CFileCache 获取不到值的原因分析
2017/02/08 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
php面向对象重点知识分享
2019/09/27 PHP
Tips 带三角可关闭的文字提示
2010/10/06 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
Jquery中的层次选择器与find()的区别示例介绍
2014/02/20 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
javascript实现的左右无缝滚动效果
2016/09/19 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
2018/03/07 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
BootstrapValidator验证用户名已存在(ajax)
2019/11/08 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
2020/10/09 jQuery
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
在PyCharm中批量查找及替换的方法
2019/01/20 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
英国HYPE双肩包官网:英国本土时尚潮牌
2018/09/26 全球购物
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
颁奖晚会主持词
2014/03/25 职场文书
个人欠款协议书范本2014
2014/11/02 职场文书
外出听课学习心得体会
2016/01/15 职场文书
Golang 正则匹配效率详解
2021/04/25 Golang