在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文件写入实例分析
Apr 08 Python
python动态网页批量爬取
Feb 14 Python
python 寻找优化使成本函数最小的最优解的方法
Dec 28 Python
python随机取list中的元素方法
Apr 08 Python
详解python异步编程之asyncio(百万并发)
Jul 07 Python
Pandas之groupby( )用法笔记小结
Jul 23 Python
Pytorch自己加载单通道图片用作数据集训练的实例
Jan 18 Python
django实现日志按日期分割
May 21 Python
如何理解python中数字列表
May 29 Python
Python基于smtplib协议实现发送邮件
Jun 03 Python
pandas 像SQL一样使用WHERE IN查询条件说明
Jun 05 Python
python爬虫请求头设置代码
Jul 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
解析php session_set_save_handler 函数的用法(mysql)
2013/06/29 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
2019/10/08 PHP
php中array_fill函数的实例用法
2021/03/02 PHP
javascript十个最常用的自定义函数(中文版)
2009/09/07 Javascript
jQuery基础框架浅入剖析
2012/12/27 Javascript
固定表格行列(expression)在IE下适用
2013/07/25 Javascript
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
jsTree事件和交互以及插件plugins详解
2017/08/29 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
2018/09/14 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
vue element table中自定义一些input的验证操作
2020/07/18 Javascript
详解JavaScript作用域 闭包
2020/07/29 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
2021/01/15 Javascript
用Python实现换行符转换的脚本的教程
2015/04/16 Python
python登录豆瓣并发帖的方法
2015/07/08 Python
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
python实现简易通讯录修改版
2018/03/13 Python
Python匿名函数及应用示例
2019/04/09 Python
详解numpy的argmax的具体使用
2019/05/27 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
Pytoch之torchvision.transforms图像变换实例
2019/12/30 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
2020/01/14 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
Keras中的多分类损失函数用法categorical_crossentropy
2020/06/11 Python
使用Python实现音频双通道分离
2020/12/25 Python
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
华为c/c++笔试题
2016/01/25 面试题
北大青鸟学生求职信
2013/09/24 职场文书
运动会通讯稿200字
2014/02/16 职场文书
离婚协议书样本
2015/01/26 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
药品开票员岗位职责
2015/04/15 职场文书
高二数学教学反思
2016/02/18 职场文书