我正在尝试定义对mongoengine中嵌入文档的列表字段执行检查和更新的方法.做我正在做的事情的正确方法是什么.代码如下.
class Comment(EmbeddedDocument):
created = DateTimeField()
text = StringField()
class Post(Document):
comments = ListField(EmbeddedDocumentField(Comment))
def check_comment(self, comment):
for existing_comment in self.comments:
if comment.created == existing_comment.created and
comment.text == existing_comment.text:
return True
return False
def add_or_replace_comment(self, comment):
for existing_comment in self.comments:
if comment.created == existing_comment.created:
# how do I replace?
# how do I add?
Run Code Online (Sandbox Code Playgroud)
这甚至是正确的方式去做这样的事情?
我在一个网络抓取项目中使用MongoEngine.我想跟踪我在所有抓取的网页上遇到的所有图像.
为此,我存储图像srcURL和图像遇到的次数.
MongoEngine模型定义如下:
class ImagesUrl(Document):
""" Model representing images encountered during web-scraping.
When an image is encountered on a web-page during scraping,
we store its url and the number of times it has been
seen (default counter value is 1).
If the image had been seen before, we do not insert a new document
in collection, but merely increment the corresponding counter value.
"""
# The url of the image. There cannot be any duplicate.
src = URLField(required=True, …Run Code Online (Sandbox Code Playgroud) 我试图找到一种优雅的方式来更新现有的MongoDB文档,其中从网页收到的数据为json.问题是我事先不知道哪些字段会被更新 - 所以我不能使用set__field,我只有一个json表示要在我的MongoDB文档中更新的字段.另外我使用的是DynamicDocuments,因此可能会在文档上设置新字段.例如:
class Study(DynamicDocument):
study_accession_nr = StringField()
study_name = StringField()
study_type = StringField()
Run Code Online (Sandbox Code Playgroud)
而json可能看起来像 - 例如:
{"_id" : "123", "study_name" : "Statistics"}
Run Code Online (Sandbox Code Playgroud)
要么
{"_id" : "123", "study_type" : "research", "study_name" : "Statistical analysis"}
Run Code Online (Sandbox Code Playgroud)
我可以从控制台轻松地做到,或者使用pymongo,但我不知道如何使用Mongoengine,除非我手动设置(myDocInstance,nameOfField,val),这对我来说看起来不那么优雅.谢谢!
使用Mongoengine并尝试形成标签云.对于每个项目,我想附加一个或多个标签.这里使用类似标签的东西(在每个问题下面).
在这里搜索和阅读了很多帖子后,我仍然无法正确地将新条目添加到ListField,或者如何替换它们.
class Item(Document):
tags = ListField(StringField(max_length=300))
Run Code Online (Sandbox Code Playgroud)
我正在尝试通过使用表单推送一个或多个新标签并收集发布的结果.在我的views.py中,我有以下检查:
if 'tags' in request.POST and request.POST['tags'] <> '':
for Tag in request.POST.getlist('tags'):
ItemData.update(push__tags__S__tags=Tag)
Run Code Online (Sandbox Code Playgroud)
尝试推送时,它失败了:
ValidationError(配置文件:5185505b73ea128e878f4e82)(列表字段中只能使用列表和元组:['tags'])
显然我使用的是错误的类型,但我迷失了如何解决这个问题.奇怪的是,由于某种原因,数据被附加到记录中..(发布"测试"和刷新浏览器)
"tags":["test","test"]}
可以向我展示一个小例子如何处理发布的字符串(来自HTML表单)并将其正确地推送到ListField(以及如何将它们全部替换).
谢谢!
我使用带有Flask-MongoEngine的MongoDB作为我的网络应用程序的ORM组件.
我已经构建了User文档架构,如下所示:
from ..core import db
class UserComics(db.EmbeddedDocument):
favorites = db.SortedListField(db.StringField(), default=None)
class UserSettings(db.EmbeddedDocument):
display_favs = db.BooleanField(default=False)
default_cal = db.StringField(default=None)
show_publishers = db.ListField(db.StringField(), default=None)
class UserTokens(db.EmbeddedDocument):
refresh_token = db.StringField(default=None)
access_token = db.StringField(default=None)
expire_time = db.StringField(default=None)
class User(db.Document, UserMixin):
# Save User document to this collection
meta = {'collection': 'users_test'}
userid = db.StringField()
full_name = db.StringField()
first_name = db.StringField()
last_name = db.StringField()
gender = db.StringField()
birthday = db.StringField()
email = db.EmailField()
friends = db.ListField(db.StringField())
date_creation = db.DateTimeField()
last_login = db.DateTimeField()
favorites …Run Code Online (Sandbox Code Playgroud) 我有以下格式的数千份文件:
{
"_id" : ObjectId("51e98d196b01c2085c72d731"),
"messages" : [
{
"_id" : ObjectId("520167056b01c20bb9eee987"),
"id" : ObjectId("520167056b01c20bb9eee987"),
},
{
"_id" : ObjectId("520167056b01c20bb9eee988"),
"id" : ObjectId("520167056b01c20bb9eee988"),
},
{
"_id" : ObjectId("520167056b01c20bb9eee989"),
"id" : ObjectId("520167056b01c20bb9eee989"),
}
],
}
Run Code Online (Sandbox Code Playgroud)
我需要删除重复的"id"字段.这是我尝试过的:
db.forum_threads.update({}, {$unset: {"messages.$.id": 1}}, {multi: true});
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
Cannot apply the positional operator without a corresponding query field containing an array.
Run Code Online (Sandbox Code Playgroud) 在我的新Django项目中,我设置了一个MongoDb数据库并使用mongoengine模块,但是我无法在视图中的shell中正确访问dabase nore."ConnectionError:您尚未定义默认连接"
我的settings.py包括以下内容:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DaTaBaSe',
'USER': 'root',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '3306',
},
'tracking': {
'ENGINE': 'django.db.backends.dummy',
'NAME': 'analytics',
}
}
import mongoengine
SESSION_ENGINE = 'mongoengine.django.sessions'
mongoengine.connect(_MONGODB_NAME, 'localhost:27017')
AUTHENTICATION_BACKENDS = (
'mongoengine.django.auth.MongoEngineBackend',
)
Run Code Online (Sandbox Code Playgroud)
在models.py中导入mongoengine
from mongoengine import *
from myproject.settings import _MONGODB_NAME
mongoengine.connect(_MONGODB_NAME, 'localhost:27017')
Run Code Online (Sandbox Code Playgroud)
提前感谢您的帮助
一个mongoengine.DynamicEmbeddedDocument可以用来利用MongoDB的灵活架构设计少.它是可扩展的,不会对字段应用类型约束,afaik.
一个mongoengine.DictField同样允许使用MongoDB的无模式性质.在文档中他们只是说(wrt DictField)
这类似于嵌入式文档,但结构未定义.
这是否意味着,届时,mongoengine.fields.DictField和mongoengine.DynamicEmbeddedDocument是完全可以互换?
编辑(更多信息):
mongoengine.DynamicEmbeddedDocument从mongoengine.EmbeddedDocument代码继承而来的是:
A
mongoengine.Document不存储在自己的集合中.mongoengine.EmbeddedDocuments应该mongoengine.Documents通过mongoengine.EmbeddedDocumentField字段类型用作字段.
A mongoengine.fields.EmbeddedDocumentField是
嵌入的文档字段 - 具有声明的document_type.只有有效值是子类
EmbeddedDocument.
这是否意味着唯一使得DictField并且DynamicEmbeddedDocument不完全可互换的是DynamicEmbeddedDocument必须通过EmbeddedDocumentField字段类型定义?
我有一个使用 MongoEngine 的架构,看起来像这样
class User(db.Document)
email = db.EmailField(unique=True)
class QueueElement(db.EmbeddedDocument):
accepts = db.ListField(db.ReferenceField('Resource'))
user = db.ReferenceField(User)
class Resource(db.Document):
name = db.StringField(max_length=255, required=True)
current_queue_element = db.EmbeddedDocumentField('QueueElement')
class Queue(db.EmbeddedDocument):
name = db.StringField(max_length=255, required=True)
resources = db.ListField(db.ReferenceField(Resource))
queue_elements = db.ListField(db.EmbeddedDocumentField('QueueElement'))
class Room(db.Document):
name = db.StringField(max_length=255, required=True)
queues = db.ListField(db.EmbeddedDocumentField('Queue'))
Run Code Online (Sandbox Code Playgroud)
我想返回一个 Room 对象的 JSON 对象,该对象将包括有关其队列的信息(连同引用的资源)和嵌套的 queue_elements(连同它们引用的“接受”引用和用户引用)
但是,当我想返回取消引用其关系的 Room 时:
room = Room.objects(slug=slug).select_related()
if (room):
return ast.literal_eval(room.to_json())
abort(404)
Run Code Online (Sandbox Code Playgroud)
我没有得到任何取消引用。我得到:
{
"_cls":"Room",
"_id":{
"$oid":"552ab000605cd92f22347d79"
},
"created_at":{
"$date":1428842482049
},
"name":"second",
"queues":[
{
"created_at":{
"$date":1428842781490
},
"name":"myQueue",
"queue_elements":[ …Run Code Online (Sandbox Code Playgroud) 我无法将文档保存到新集合,然后从旧集合中删除它们.我像这样创建一个新对象:
class Test(mongo.Document):
field = mongo.StringField()
t = Test(field="test")
t.switch_collection('default')
t.save()
t.switch_collection('switched')
t.save()
t.switch_collection('default')
t.delete()
Run Code Online (Sandbox Code Playgroud)
似乎只执行第一次保存到默认集合,然后执行任何操作.我玩了很多差异选项,比如每次切换/保存后重新加载对象以及mongoengine上下文管理器:
with switch_collection(Test, 'mongoswitch') as test:
test(field="switch").save()
Run Code Online (Sandbox Code Playgroud)
我的mongo设置看起来像(先叫):
app.config["MONGODB_SETTINGS"] = {'db': 'TestDB'}
mongo = MongoEngine(app)
Run Code Online (Sandbox Code Playgroud)
使用mongoengine 0.10和pymongo 2.8.1和Python 3.4.
有人有想法吗?非常感谢.