在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中列表(list)操作方法汇总
Aug 18 Python
编写Python脚本来获取mp3文件tag信息的教程
May 04 Python
Django的URLconf中使用缺省视图参数的方法
Jul 18 Python
Python装饰器知识点补充
May 28 Python
python实现对csv文件的列的内容读取
Jul 04 Python
计算机二级python学习教程(2) python语言基本语法元素
May 16 Python
python反编译学习之字节码详解
May 19 Python
Python自定义一个异常类的方法
Jun 27 Python
在ipython notebook中使用argparse方式
Apr 20 Python
解决IDEA 的 plugins 搜不到任何的插件问题
May 04 Python
用python实现学生管理系统
Jul 24 Python
python库Tsmoothie模块数据平滑化异常点抓取
Jun 10 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 smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
PHP错误处理函数
2016/04/03 PHP
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
JS创建对象的写法示例
2016/11/04 Javascript
Angular8基础应用之表单及其验证
2019/08/11 Javascript
vue中nextTick用法实例
2019/09/11 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
Python标准库urllib2的一些使用细节总结
2015/03/16 Python
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
用matplotlib画等高线图详解
2017/12/14 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
Python实现冒泡排序算法的完整实例
2020/11/04 Python
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
如何在存储过程中使用Loop
2016/01/05 面试题
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
护士实习生自我鉴定范文
2013/12/10 职场文书
建筑工程专业学生的自我评价
2013/12/25 职场文书
工作失误检讨书范文大全
2014/01/13 职场文书
职工趣味运动会方案
2014/02/10 职场文书
工程质量承诺书范文
2014/03/27 职场文书
个人欠款担保书
2014/05/20 职场文书
关工委先进个人事迹材料
2014/05/23 职场文书
小学生校园广播稿
2014/09/28 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
联村联户简报
2015/07/21 职场文书
跳高加油稿
2015/07/21 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python