我在 mongoengine 上有一堂课
class Post(EmbeddedDocument):
uid = StringField(required=True)
text = StringField(required=True)
value = StringField()
class Feed(Document):
label = StringField(required=True)
feed_url = StringField(required=True)
posts = ListField(EmbeddedDocumentField(Post))
Run Code Online (Sandbox Code Playgroud)
我正在尝试从某个“父”文档更新 Post EmbeddedDocument 属性名称文本。作为第一步,我检索 Feed 文档
model = Feed.objects(_id="....").first()
Run Code Online (Sandbox Code Playgroud)
然后我想更新嵌入文档“Post”的属性文本。
我怎样才能用 mongoengine 实现它?谢谢
我正在使用mongoengine并尝试进行简单的迁移.我有一个字段,我想从StringField迁移到ReferenceField到另一个Object.我计划手动进行迁移,首先根据来自旧StringField的字符串构建新对象,然后显式设置它.
问题是,一旦我更改了字段类型,我甚至无法访问其中一个顶级文档.是否需要在我的文档的类代码中创建一个"虚拟"字段作为新字段的占位符?这对我来说似乎很糟糕所以我认为有更好的方法吗?
这是错误,这是因为来自DB(StringField)的字段与引用字段不一致.
/usr/lib/python2.7/site-packages/mongoengine/queryset/base.pyc in __getitem__(self, key)
149 return queryset._get_as_pymongo(queryset._cursor.next())
150 return queryset._document._from_son(queryset._cursor[key],
--> 151 _auto_dereference=self._auto_dereference)
152 raise AttributeError
153
/usr/lib/python2.7/site-packages/mongoengine/base/document.pyc in _from_son(cls, son, _auto_dereference)
568 try:
569 data[field_name] = (value if value is None
--> 570 else field.to_python(value))
571 if field_name != field.db_field:
572 del data[field.db_field]
/usr/lib/python2.7/site-packages/mongoengine/fields.pyc in to_python(self, value)
935 not isinstance(value, (DBRef, Document, EmbeddedDocument))):
936 collection = self.document_type._get_collection_name()
--> 937 value = DBRef(collection, self.document_type.id.to_python(value))
938 return value
939
/usr/lib/python2.7/site-packages/mongoengine/base/fields.pyc in to_python(self, value)
390 def to_python(self, value):
391 …Run Code Online (Sandbox Code Playgroud) 我的Flask应用程序在过去一个月突然变得非常慢,我不知道哪些更改可以将响应时间从1s 提升到30s.
我一直在使用Flask和MongoEngine,Redis也用于缓存.MongoDB与Flask应用程序放在同一台服务器上.
我试过剖析Flask,这是报告:
127.0.0.1 - - [17/Feb/2014 19:51:47] "GET / HTTP/1.0" 200 -
--------------------------------------------------------------------------------
PATH: '/items'
637497 function calls (618866 primitive calls) in 30.961 seconds
Ordered by: internal time, call count
List reduced from 702 to 30 due to restriction <30>
ncalls tottime percall cumtime percall filename:lineno(function)
153 30.127 0.197 30.127 0.197 {method 'recv' of '_socket.socket' objects}
319965 0.150 0.000 0.150 0.000 {isinstance}
1322/740 0.079 0.000 0.178 0.000 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/dereference.py:147(_attach_objects)
77 0.079 0.001 0.079 0.001 {method 'sendall' …Run Code Online (Sandbox Code Playgroud) 我有一个巨大的MongoDB数据库,由mongoengine驱动,其中的对象有一个日期.为了使工作更轻松,我想存档旧对象,但将它们保存在某处.
我一直在阅读文档,并碰上了switch_db和switch_collection.但是,我不能做任何工作.
对于这两种情况,文档都引用了两种使用方案.
作为一项QuerySet行动:
user = User.objects.get(id=user_id)
user.switch_collection('old-users')
user.save()
Run Code Online (Sandbox Code Playgroud)
这个问题是它只适用于单个对象.无法批量存档多个文档.
作为context_manager:
with switch_collection(Group, 'group1') as Group:
Group(name="hello testdb!").save() # Saves in group1 collection
Run Code Online (Sandbox Code Playgroud)
使用此我甚至无法进行查询,收到以下错误:
ValidationError (Document:None) (Field is required...
Run Code Online (Sandbox Code Playgroud)我已经尝试使用mongoengine搜索存档数据的方法,但似乎没有一个选项可行.你有什么建议吗?
是否有相同功能PyMongo或mongoengine到MongoDB的mongodump?我似乎无法在文档中找到任何内容.
使用案例:我需要定期备份远程mongo数据库.本地机器是没有安装mongo的生产服务器,我没有管理员权限,所以我不能subprocess用来打电话mongodump.我可以在virtualenv上本地安装mongo客户端,但我更喜欢API调用.
非常感谢 :-).
如何打印我用mongoengine建立的mongodb查询?例:
queryset = Document.objects(**query)
print queryset.to_mongodb_query()
Run Code Online (Sandbox Code Playgroud) 有没有任何解决方案可以在 mongoengine 中获取文档特定字段的列表,例如获取我们使用函数的文档列表.objects,或者我必须使用循环来生成文档特定字段的列表?
例如我有这个Document:
class User(Document):
email = StringField()
name = StringField()
Run Code Online (Sandbox Code Playgroud)
我有所有用户的电子邮件列表string
我做了以下
-- `sudo apt-get install mongodb-org`
-- go to `etc/mongod.conf` change bindIp to: `0.0.0.0`
-- sudo mkdir /data/db
-- start without auth to create user
`sudo mongod --port 27017 --dbpath /data/db`
-- open shell with : mongo --port 27017
```
> use admin
> db.createUser( { user: "useradmin", pwd: "mypassword", roles: [ { role: "root", db: "admin" } ] } )
```
-- Restart with auth required(ctrl+c the above mongod process):
`sudo mongod --auth --port 27017 --dbpath /data/db'
-- To …Run Code Online (Sandbox Code Playgroud) 我正在使用 django restframework 并且想要处理多个数据库。我正在使用 django 函数 using(alias) 和 switch_db(alias) 在我想要获取、发布或更新数据时在数据库之间手动切换。
我在发布和更新 data.ie 时遇到问题,每当 serializer.is_valid() 将被调用。
serializer.is_valid() 将首先检查 model.py 文件中的 db_alias。如果我没有在 meta 下指定 db_alias,它将选择默认数据库进行验证。如果我在模型中指定 db_alias,它将选择该数据库进行验证。
但是我不想在模型中指定 db_alias 因为我的用例是根据我的视图文件中的某些逻辑将数据存储在不同的数据库中。所以动态地我想从视图中选择数据库并想在其中存储数据。
几乎我已经实现了,但是当我的模型具有参考字段时我遇到了问题。在这种情况下,serializer.is_valid 将转到默认数据库以验证该引用字段。
所需详细信息:我正在使用 mongoengine(0.9.0)、文档、文档序列化程序。
我的文件如下:
模型.py:
class ngroup(Document):
groupname = StringField(max_length=100, required=True)
description = StringField(max_length=100, required=False)
parent = ReferenceField('ngroup',null=True)
created_ts = DateTimeField(default=datetime.now())
modified_ts = DateTimeField(default=datetime.now())
is_deleted = BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)
序列化程序.py:
from device_management.models import ngroup
from rest_framework_mongoengine.serializers import DocumentSerializer
from mongoengine import EmbeddedDocumentField, ReferenceField, StringField, ObjectIdField, IntField, BooleanField, FloatField, DateTimeField,ListField
class ngroupSerializer(DocumentSerializer):
class Meta:
model …Run Code Online (Sandbox Code Playgroud) 我有一个现有的 mongo 文档,该文档已通过 REST API 公开。API 请求将包含文档中的某些字段,如果该字段为空,则需要使用新值更新这些字段或在其中插入新值。如何对现有 mongoengine 文档的字段执行更新?我正在使用 marshmallow-mongoengine 在烧瓶上进行序列化。
我面临的问题是,如果请求负载中缺少某个字段,则在使用剩余字段作为 kwargs 调用 update 时会导致将缺少的字段设置为 None 。如何仅更新或插入有效负载中给出的字段?