当前位置:首页 > PHP教程 > PHP总结归纳

mongoengine使用笔记

最近重新拾起django,但是django并不支持mongodb,但是有一个模块mongoengine可以实现django model类似的封装.但是mongoengine的中文文档几乎没有,有的也是简短的几句介绍和使用.下面我就分享一下我在使用过程中所记录下的一些笔记,可能有点乱.大家可以参考一

最近重新拾起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")



【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!