在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中的私有属性
Aug 21 Python
Python数据库的连接实现方法与注意事项
Feb 27 Python
Python设计模式中单例模式的实现及在Tornado中的应用
Mar 02 Python
Python爬取APP下载链接的实现方法
Sep 30 Python
利用python获取某年中每个月的第一天和最后一天
Dec 15 Python
python3利用venv配置虚拟环境及过程中的小问题小结
Aug 01 Python
python 获取等间隔的数组实例
Jul 04 Python
结合OpenCV与TensorFlow进行人脸识别的实现
Oct 10 Python
python使用HTMLTestRunner导出饼图分析报告的方法
Dec 30 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
Feb 27 Python
Django调用支付宝接口代码实例详解
Apr 04 Python
TensorFlow保存TensorBoard图像操作
Jun 23 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
水质对咖图啡风味的影响具体有哪些
2021/03/03 冲泡冲煮
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
PHP 冒泡排序算法的实现代码
2010/08/08 PHP
php中__toString()方法用法示例
2016/12/07 PHP
phpStudy配置多站点多域名和多端口的方法
2017/09/01 PHP
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
2012/02/16 Javascript
解析offsetHeight,clientHeight,scrollHeight之间的区别
2013/11/20 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
移动端脚本框架Hammer.js
2016/12/15 Javascript
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
vue :src 文件路径错误问题的解决方法
2018/05/15 Javascript
angularJs中$http获取后台数据的实例讲解
2018/08/08 Javascript
vue 音乐App QQ音乐搜索列表最新接口跨域设置方法
2018/09/25 Javascript
vue实现分页组件
2020/06/16 Javascript
详解小程序循环require之坑
2019/03/08 Javascript
js实现网页版贪吃蛇游戏
2020/02/22 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
Python中用于检查英文字母大写的isupper()方法
2015/05/19 Python
pandas中apply和transform方法的性能比较及区别介绍
2018/10/30 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
2019/01/29 Python
使用Python Pandas处理亿级数据的方法
2019/06/24 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
Python装饰器使用你可能不知道的几种姿势
2019/10/25 Python
Python 实现加密过的PDF文件转WORD格式
2020/02/04 Python
浅析Python 多行匹配模式
2020/07/24 Python
韩国三星旗下的一家超市连锁店:Home Plus
2016/07/30 全球购物
企业管理部经理岗位职责
2013/12/24 职场文书
高中生班主任评语
2014/04/25 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
导游词之广东佛山(南风古灶)
2019/09/24 职场文书
利用JavaScript写一个简单计算器
2021/11/27 Javascript
在 Python 中利用 Pool 进行多线程
2022/04/24 Python
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers