我有mongoengine的内存问题(在python中).
假设我有大量的custom_documents(数千).我想要处理它们,如下所示:
for item in custom_documents.objects():
process(item)
Run Code Online (Sandbox Code Playgroud)
问题是custom_documents.objects()加载内存中的每个对象,我的应用程序使用几GB ...
我怎样才能让它更具记忆性呢?有没有办法让mongoengine懒惰地查询数据库(它在迭代查询集时请求对象)?
我有一个列表列表,像这样:
li = [[('A', 'one'), ('A', 'two')], [('B', 'three'), ('B', 'four')]]
Run Code Online (Sandbox Code Playgroud)
并且我需要查询一个mongo数据库,以获取其列表字段在的每个子列表中至少包含一项的所有对象li。例如:具有[('A','one')OR('A','Two')]和[['B','三个')OR('B','四个')]的项目...
我正在使用mongoengine,但是如果我可以使用其他方法来完成此操作,则可能会更改。所以现在我在做很多这样的查询,以避免重复输入:
final = set()
for sublist in li:
query = Obj.objects(list_field__in=sublist)
final &= set(query)
Run Code Online (Sandbox Code Playgroud)
问题在于,在处理较大的查询结果时,这非常慢(我认为,使该设置花费很长时间)。有什么办法可以加快速度吗?具体来说,有没有一种方法可以避免从查询结果中创建集合/列表?
我真的很想能够以某种方式写这样的东西:
query = Obj.objects(list_field__in=li[0] AND list_field__in=li[1] AND ...)
Run Code Online (Sandbox Code Playgroud)
编辑:下面的答案不适用于进一步的测试,因为mongoengine不允许 Q(field=x) & Q(field=y)
Edit2:这是我想做的等效mongoDB查询:
db.obj.find({ "$and": [
{"list_field": {"$in":
[["A", "one"], ["A", "two"]]
}},
{"list_field": {"$in":
[["B", "three"], ["B", "four"]]
}}
]})
Run Code Online (Sandbox Code Playgroud)
我可以在mongoengine中做到吗?它不会让我用Q(list_field__in=[('A', 'one'), ('A', 'two')]) | Q(list_field__in=[('B', 'three'), ('B', 'four')])
我正在构建一个基于Pyramid,MongoEngine和Twitter Bootstrap的Web服务.它只包含几个简单的形式.什么是实现表单的最佳方式,以便它们与Twitter Bootstrap很好地集成?大多数情况下,我担心需要自己手动破解所有HTML.
什么Pyramid框架与Bootstrap一起开箱即用?
在这种情况下,我需要传播CSS类等等所有模板,这可能是最简单的方法吗?
我使用的是MongoEngine模型,但只有极少数这些模型并且适应它们以形成框架很容易.
我有一个使用mongoengine和烧瓶安全的python烧瓶应用程序,从示例中构建,以暴露所有的确认,注册,跟踪和恢复功能.
一切都有效,除了用户在代码中使用以下命令创建:
MongoEngineUserDatastore.create_user(...)
Run Code Online (Sandbox Code Playgroud)
无法登录.也就是说,当您尝试使用此用户登录时,您会收到一条错误消息:
"Email requires confirmation"
Run Code Online (Sandbox Code Playgroud)
由于尚未发送带有散列URL的电子邮件,因此无法确认.是否有一个参数我可以通过某处传递来确认创建此用户或在某处设置确认标志?
这是我的代码:
我正在尝试分析我的查询性能,并希望改善它们。我使用mongoengine包装器。尽管我正在使用查询日志并获取原始mongo查询并运行explain,但我无法从mongoengine中找到使用explain()的方法,但我想通过mongoengine使用explain来减轻监控的麻烦。有任何想法吗
假设Venue是:
from mongoengine import *
from mongoengine_extras.fields import AutoSlugField
class Venue(Document):
name = StringField(required=True)
venue_slug = AutoSlugField()
Run Code Online (Sandbox Code Playgroud)
我想根据名称更新所有的venue_slug字段.我尝试:
for v in Venue.objects():
v(venue_slug = str(v.name)).update()
Run Code Online (Sandbox Code Playgroud)
但我得到:
v(venue_slug = str(v.name)).update()
TypeError: Error when calling the metaclass bases
'Venue' object is not callable
Run Code Online (Sandbox Code Playgroud)
我的更新功能是否正确?如果您不熟悉,AutoSlugField()可以为StringField()更新编写示例吗?
我在带有id(ReferenceField)的模型中有一个ListField,如果某个id在该列表中,我需要进行查询.AFAIK我有两种选择:
Model.objects.filter(refs__contains='59633cad9d4bc6543aab2f39')
Run Code Online (Sandbox Code Playgroud)
要么:
Model.objects.filter(refs__in=['59633cad9d4bc6543aab2f39'])
Run Code Online (Sandbox Code Playgroud)
哪一个对这个用例最有效?
该模型看起来像:
class Model(mongoengine.Document):
refs = mongoengine.ListField(mongoengine.ReferenceField(SomeOtherModel))
Run Code Online (Sandbox Code Playgroud)
从我在mongoengine文档中可以看到的,http: //docs.mongoengine.org/guide/querying.html#string-queries,contains 实际上是一个字符串查询,但它在这里也令人惊讶地工作.但我猜__in更有效率,因为它应该针对列表进行优化,或者我错了?
我们使用Flask-Restful来实现API.作为数据库,我们使用MongoDB和MongoEngine作为ODM.为了让MongoEngine与Restful一起工作,我们遵循了这篇博客文章.为了获得正确的json格式,我们使用内置marsheling方法.这适用于单个对象(例如集合中的一个项目),但是当对一个对象列表进行编组(例如集合的所有项目)时,会引发AttributeError(尽管我们使用与单个对象相同的语法).这就是我们的模型和我们的视图的样子(我不粘贴路由,因为它们在一个单独的文件中工作).
模型:
class Task(db.Document):
name = db.StringField()
description_mini = db.StringField()
Run Code Online (Sandbox Code Playgroud)
观点:
parser = reqparse.RequestParser()
parser.add_argument('task_id', type=str)
task_format = {
"name": fields.String,
"description_mini": fields.String
}
class TasksView(Resource):
@marshal_with(task_format)
def get(self):
tasks = Task.objects().all()
return tasks, 200
class TaskDetailView(Resource):
@marshal_with(task_format)
def get(self):
args = parser.parse_args()
startup_id = args['task_id']
task = Task.objects(id=task_id).first()
return task, 200
Run Code Online (Sandbox Code Playgroud)
完整的堆栈跟踪:
AttributeError
Traceback (most recent call last)
File "/project/venv/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/project/venv/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app …Run Code Online (Sandbox Code Playgroud) 我正在尝试使MongoEngine与Django REST框架一起使用。通过单击此链接使mongoengine和django rest框架正常运行,我设法使所有工作正常进行,但必须在REST框架中禁用“ PERMISSION CLASSES”,如下所示
'DEFAULT_PERMISSION_CLASSES': [
#'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
]
否则,我得到这个错误“无法对不具备视图下应用DjangoModelPermissions .model或.queryset财产。” 原因似乎是从“ Collection.objects”或“ Collection.objects.all()”返回的值无法通过REST框架中的Permission.py中的“ has_permission”函数传递。
有人可以帮忙看看吗?
我flask使用docker 打包我的python()应用程序.在我的应用程序中,我正在使用datetime库生成UTC日期datetime.utcnow().
不幸的是,当我检查保存的数据时MongoDB Compass,UTC日期偏移了两个小时(到我当地的时区).我的所有docker容器都设置了时区Etc/UTC.Morover,mongoengine与MongoDB的连接使用tz_aware=False和tzinfo=None阻止飞行日期转换.
偏移来自何处以及如何解决?