MongoDB的另一个文档映射器(ODM)

yadm的Python项目详细描述


一个文档映射器图片::https://travis-ci.org/zzzsochi/yadm.svg?branch=master
:目标:https://travis ci.org/zzzsochi/yadm

…图片::https://coveralls.io/repos/github/zzzsochi/yadm/badge.svg?branch=master
:目标:https://coveralls.io/github/zzzsochi/yadm?branch=master




它是一个小而简单的odm,可与mongodb一起使用。完整文档:http://yadm.readthedocs.org



----
要求
-






----
快速启动
----



创建模型
=代码::python

from datetime import datetime


import pymongo

from yadm import database
from yadm import document,embeddeddocument
from yadm import fields
from yadm.serialize import to_mongo



class user(document):
_集合"用户"

name=fields.stringfield()
email=fields.emailfield()



class postlogitem(embeddeddocument):
op=fields.stringfield(choices=['created','comment\u added'])
at=fields.datetimefield()
data=fields.mongomapfield()



class post(文档):
r/>log=fields.listfield(fields.embeddeddocumentfield(postlogitem))




class comment(document):
referenceField(post)
text=fields.stringfield()

所有文档都是从类"document"创建的。您可以使用多重继承。

```````````magic attribute设置模型文档的集合名称。




连接到数据库
==代码::python

client=pymongo.mongoclient('mongodb://localhost:27017')
db=database(client,blog')

``database``对象是对``pymongo``或``motor``` database``的包装。



create documents
==br/>

----


代码::python

user=user(name='bill',email='bill@galactic.hero')
db.insert_one(user)


只需将文档插入数据库即可。



post
---

代码::python

post=post()
post.user=user
post.title='small post'
post.body='bla bla bla…'
post.log=[postlogitem(op='created',at=datetime.utcnow())]
db.insert_one(post)

他发布了……代码::python

comment=comment()
comment.user=user
comment.post=post
comment.text="re:bla bla bla bla…"
db.insert_one(comment)
db.update_one(post,push={
"log":to_mongo(postlogtem(op='comment_added',
at=comment.created_at,
data={
"comment":comment.id,
"user":comment.user.id,
})
邮政日志。这是非常有用的情况。




查询
==


代码::python

qs=db(post).find({title':{'$regex':'^s'})
assert qs.count()>;0


1。'DB(POST)``创建"queryset"对象;
2。`` find``method获取原始查询并返回具有更新条件的新的``queryset``对象;
3。`` count``方法查询数据库并返回值。

…代码::python

for post in qs:
assert post.title.startswith('s')

`````````````````````````````````````````````````````````````````````````查询并返回文档生成器。




代码::python

post=db(post)。查找一个({'user':user.id})




get_document
----


get the document by id from primary.

代码::python

user=db.get_document(user,user.id)




----

code::python

user=post.user


get attribute with reference使查询成为引用的集合。警告:N+1问题!
我们在"queryset"对象中有一个缓存,对于一个queryset只获取一个引用的文档。



代码::python

comments=db(comment).find({'post':post.id}).sort(('created_at',1))
在comments.lookup('user'):
print(comment.user.name,comment.text)


此代码使用`$lookup``语句创建聚合查询,以解析引用。



…代码::python

agg=(db.aggregate(comment)
.match(user=user.id)
.group(_id='post',count={'$sum':1})
.sort(count=-1))


agg中的项:
print(item)

或传统的mongodb语法:





agg=db.aggregate(comment,pipeline=[
{'br/>{'match':{'user':user.id},
{{'group':{'id'''post','count':{'$sum'''1}},
{{'sort':{'count':-1}}},
















2.0.5(2019-2019-2.0.5(2019-2019-2.0.0.5(2019-2.02-25)添加``聚合.提示``方法。




>2.0.4(2019-02-20)2.0.4(2019-02-02-20)2.0.4(2019-02-02-20)2.0.1(2018-11-04)2.0.0.1(2018-11-11-04)2.0.0.0.0.0.0.0.0.0.1(2018-br/>






























2.0.0(2018-10-25)
==

*大改写<;https://www.youtube.com/watch?文档逻辑:
-``document.`raw``现在只包含来自pymongo的数据,不包含任何attributenotset``或``not loaded`;
-``document.``已删除已更改的文档:所有更改都反映到``document.`cache`;
-``document.``未加载未加载投影的字段集;
>-``document.``未加载未加载未加载投影的字段集;未加载未加载未加载投影的字段集;
>>
是的-`` document.u new_uu document_uu``对于直接在代码中创建的文档对象,标志是``true`;
-`` document.uu log_uuu``类似于列表的容器,其中包含文档更改日志(目前不稳定的api);
-`` document.u data_uuuuu``被视为已弃用而删除;
-现在不允许将字段设置为类;
-默认值不为惰性并使用文档实例创建;

*更新pymongo(3.7)和motor(2.0)的最低版本:
-添加"database.bulk-write"`;
-添加"database.insert-one"`,`"database.insert-many"和"database.delete-one"`;
-不推荐"database.insert`,`"database.remove`;
-删除"database.bulk"(无需很抱歉,在不推荐使用期内);
-add``queryset.count cuu documents```;
-add``queryset.update'one``和``queryset.update'queryset.update``````;
-add``queryset.delete'one``和``queryset.delete'queryset.delete'mumany`;
-add``queryset.queryset.finu one和更新``````queryset.queryset.queryset.queryset.finu one和更新````````````````````````queryset.queryset.queryset.queryset和更新`````````删除``;
-deprecate``queryset.count`;
-不推荐使用``queryset.update``,``queryset.remove`和``queryset.find`和` modify`;
-删除不推荐使用的``查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询'参考文献列表。



1.4.15(2017-12-27)
>

===========


*向``数据库``中添加``投影``参数。获取``文档``和``数据库``重新加载`;
*向``文档``中添加``投影``属性。










================


>


==================



为save``enum.enum``添加'enumfield`;
*为simple state m添加'enumstatefield`'基于``enum.enum``.




1.4.13(2017-10-10-31)1.4.13(2017-10-10-31)1.4.13(2017-10-10-31)1.4.13(2017-10-10-31)1.4.10(2017-07-07)1.4.10(2017-07-07)1.4.10(2017-07-07)1.4.4.10(2017-07-07)1.4.4.10(2017-07-07)1.4.4.10(2017-10-10-31)1.4.10(2017-10)1.4.10






<

*``referencefield.from_mongo``如果找不到文档,请尝试从主
默认情况下。




>1.4.9(2017-07-06)1.4.9(2017-07-07-06)1.4.9(2017-07-07-06)1.4.4(2017-05-17)1.4.4.4.9








=

=

=










========


*增加``TimeDelTaField ``TimeDelTaField ``TimeDelTaField ``TimeDel对于存储持续时间;
*添加"simpleembeddeddocumentfield"用于简单地创建嵌入文档元素

…python



class doc(document)类doc(document)类doc(document):
>embedded=SimpleEmbembembeddedddddocumentfield({
‘i’:integerfield(),
‘s’:stringfield(),








========
=====








<1.4.2(2017-04-09-09-2017-04-09-2017-04-04-09)1.4.4.3(2017-05-)
==================

*用于写操作的附加参数(如"write-concern`)";默认情况下,
*`"create-fake``保存带有"write-concern"多数的文档。



1.4.0(2017-04-05)
==

*删除pymongo 2支持;
*数据库和集合的附加选项;
*添加"database.get-document`;
*添加``typedembeddeddddddadddocumentfield`````typedembeddeddddddaddaddaddadd````;
*``reload``参数的``database.update‘one``必须是关键字
(可能是向后不可写的)。











<1.3.1.1.3.1(2017-02-19)1.3.1(2017-02-19)1.3.1.1(2017-02-21)1.3.1(2017-02-21)


=>





*为"money"添加货币支持:
-全部重写"money"类型。现在已经不是"十进制"的子类了;
-为货币添加存储:``yadm.fields.money.currency.currency.currency.currency.currency存储```;



>1.2.1(2017-01-19)
==========br/>










<1.2.0(2016-12-27)









<1.2.0(2016-12-27)
1.2.0(2016-12-27)===


*删除MongoDB 2.x支持;
*用于更新和删除结果的对象;
*使用冒牌货,而不是冒牌工厂。



1.1.4(2016-08-20)
====


*为"批量"添加一些功能:
-`"批量"。更新一个(文档,**kw)`:批量添加更新一个文档的方法;
-`"批量"。查找(查询)。更新(**kw)`:更新多个文档通过查询;
-``bulk.find(query.upsert().update(**kw)````:upsert document;
-``bulk.find(query.find(query.query).remove(**kw)``````````````bulk.update.update(kw)```````````````````bulk.find```````````````删除文档;





>>

>
>>
-``bulk`` bulk.find`````` u分``方法和``钱。``类方法;




>1.1(2016-04-26)

======



*在queryset级别添加缓存,并将其用于"referencefield";


*在mongo聚合框架支持中添加mongo聚合框架;



*在"queryset"中添加"read"首选项设置;

>
*在"queryset"中添加"exc"参数,如果找不到则查找一个参数,如果找不到则引发异常;如果找不到,则查找一个参数;如果找不到则查找一个参数,则引发异常;如果找不到则查找一个参数,>
*添加``"queryset.remove`;

*deprecate``queryset.with_id`;

*重构环。



1.0(2015-11-14)
==

==

*更改文档结构。不再有坏的"basedocument."属性:
-`basedocument.\uu raw':mongo的原始数据;
-`basedocument.\uu cache':cached objects,casted with fields;
-`basedocument.\uu changed':changed objects.

*更改自定义字段的api:
-不再需要crea每个字段的te字段描述符;
-`只为setattr调用"prepare_value";
-`只为将对象保存到mongo调用"to_mongo";
-`只为从"basedocument"加载值调用"from_mongo";
-删除"field.default"属性。使用"field.get_default"方法;
-添加"field.get_if_loaded"和"field.get_if_attribute_not_set"方法;
-默认情况下,如果未从投影加载字段,则引发"notloadedrorror";

*对"referencefield"的更改:
-如果链接被阻塞,则引发"brokenreference";
-如果文档未保存到数据库,则引发"notbindingtodatabase";

*"field"的"smart_null"关键字;

*文档中的字段必须是实例(而不是类!);

*删除"arrayContainer"和"arrayContainerField";

*删除旧的"mapintKeysField"和"mapobjectidKeysField"。使用新的"mapcustomkeysfield";

*添加"database.update_one"方法对指定文档运行简单的更新查询;

*添加"queryset.distinct";

*"serialize.from_mongo"现在接受"not_loaded"序列,该序列的字段名必须标记为"not loaded"、"parent"和"name";

*`序列化。to_mongo`不要调用'fielddescriptor.\uu set_uuu`;

*伪装者!生成测试对象的子系统;

*测试现在使用pytest;

*等等…

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何使用“Wed,01 Jul 2015 17:32:41 EDT”解析字符串   java Storm apache升级(1.0.0到2.0.0)   java类驻留在不同的目录中,而不是包指定的目录。为什么?   将Java中的图像缩放到非常小的维度   java如何通过子文档从自定义方面访问ElasticSearch parentdoc字段   java如何在RationalSoftwareArchitect中使用findbugs?   Java中的事件提升处理   java值被添加到arrayList的所有索引中,而不是在“”时添加到最后一个索引中。正在使用arraylist的add()方法   JFrame中的java JPanel派生类   java如何用循环和异步方法模拟类   java Android阻止可绘制背景超出视图范围   为客户排序Java阵列   java Apache poi如何将工作表设置为枚举位置值属性?   java Rhino在使用自定义类参数调用javascript函数时出错   java格式化日期从年月日到年月日   spring如何修复java。lang.illegalargumentexception在此特定场景中是否尝试创建具有null实体的合并事件?   java如何创建更好的对象