在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中使用urllib2获取http请求状态码的代码例子
Jul 07 Python
举例讲解Python中的算数运算符的用法
May 13 Python
Python根据区号生成手机号码的方法
Jul 08 Python
浅谈pyhton学习中出现的各种问题(新手必看)
May 17 Python
PyTorch线性回归和逻辑回归实战示例
May 22 Python
python实现音乐下载的统计
Jun 20 Python
Python使用Selenium爬取淘宝异步加载的数据方法
Dec 17 Python
Python函数的定义方式与函数参数问题实例分析
Dec 26 Python
Python3 hashlib密码散列算法原理详解
Mar 30 Python
Python unittest单元测试框架及断言方法
Apr 15 Python
python中lower函数实现方法及用法讲解
Dec 23 Python
Python 中random 库的详细使用
Jun 03 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中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
2011/12/01 PHP
php中使用redis队列操作实例代码
2013/02/07 PHP
浅谈thinkphp的实例化模型
2015/01/04 PHP
PHP基于回溯算法解决n皇后问题的方法示例
2017/11/07 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
js函数在frame中的相互调用详解
2014/03/03 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
2016/08/08 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
JS中使用正则表达式g模式和非g模式的区别
2017/04/01 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
2019/08/12 Javascript
vue-resource post数据时碰到Django csrf问题的解决
2020/03/13 Javascript
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
python读取目录下最新的文件夹方法
2018/12/24 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
2019/06/19 Python
python调用自定义函数的实例操作
2019/06/26 Python
Python整数对象实现原理详解
2019/07/01 Python
详解Python 4.0 预计推出的新功能
2019/07/26 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
django rest framework使用django-filter用法
2020/07/15 Python
python3.7调试的实例方法
2020/07/21 Python
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
酒店拾金不昧表扬信
2014/01/18 职场文书
人事部经理岗位职责
2014/03/07 职场文书
布达拉宫导游词
2015/02/02 职场文书
赢在中国观后感
2015/06/02 职场文书
运动会闭幕式通讯稿
2015/07/18 职场文书
禁毒主题班会教案
2015/08/14 职场文书
2016七夕情人节感言
2015/12/09 职场文书
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA