在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 open()文件处理使用介绍
Nov 30 Python
Python itertools模块详解
May 09 Python
Python中用altzone()方法处理时区的教程
May 22 Python
Python中运算符"=="和"is"的详解
Oct 08 Python
详解 Python中LEGB和闭包及装饰器
Aug 03 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
Jun 13 Python
tensorflow实现图像的裁剪和填充方法
Jul 27 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
Python生命游戏实现原理及过程解析(附源代码)
Aug 01 Python
python实现在一个画布上画多个子图
Jan 19 Python
python raise的基本使用
Sep 10 Python
python连接mongodb数据库操作数据示例
Nov 30 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
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
php中怎么搜索相关联数组键值及获取之
2013/10/17 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
javascript的对话框详解与参数
2007/03/08 Javascript
js 单引号 传递方法
2009/06/22 Javascript
JavaScript delete 属性的使用
2009/10/08 Javascript
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
解决在Bootstrap模糊框中使用WebUploader的问题
2018/03/22 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
JS实现的视频弹幕效果示例
2018/08/17 Javascript
使用electron将vue-cli项目打包成exe的方法
2018/09/29 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
2020/04/13 Javascript
js实现筛选功能
2020/11/24 Javascript
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
Python File readlines() 使用方法
2018/03/19 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
python 实现从高分辨图像上抠取图像块
2020/01/02 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
很酷的HTML5电子书翻页动画特效
2016/02/25 HTML / CSS
快时尚眼镜品牌,全国连锁眼镜店:LOHO眼镜生活
2018/10/08 全球购物
英格兰足协官方商店:England Store
2019/07/12 全球购物
经理助理岗位职责
2014/03/05 职场文书
保护母亲河倡议书
2014/04/14 职场文书
最美孝心少年事迹材料
2014/08/15 职场文书
文明好少年事迹材料
2014/08/19 职场文书
医院科室评语
2015/01/04 职场文书
高校教师个人总结
2015/02/10 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
2015毕业寄语大全
2015/02/26 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书
浅析MongoDB之安全认证
2021/06/26 MongoDB