我有以下mongoengine型号:
class MyModel(Document):
date = DateTimeField(required = True)
data_dict_1 = DictField(required = False)
data_dict_2 = DictField(required = True)
Run Code Online (Sandbox Code Playgroud)
在某些情况下,DB中的文档可能非常大(大约5-10MB),而data_dict字段包含复杂的嵌套文档(dicts列表的字典等等).
我遇到过两个(可能是相关的)问题:
当我从数据库查询单个大型文档,然后访问其字段时,只需执行以下操作需要10-20秒:
m = MyModel.objects.first()
val = m.data_dict_1.get(some_key)
Run Code Online (Sandbox Code Playgroud)对象中的数据不包含对任何其他对象的任何引用,因此它不是取消引用的对象的问题.
我怀疑它与mongoengine的内部数据表示的某些低效率有关,这会影响文档对象的构造以及字段访问.我能做些什么来改善这个吗?
我不确定它是MongoEngine中的一个错误还是我错过了什么.我设置了以下模型:
class Features(EmbeddedDocument):
version = FloatField()
data = ListField(StringField)
class Article(Document):
vendor = ReferenceField(Vendor)
url = URLField()
author = StringField()
clean_content = StringField()
features = EmbeddedDocumentField(Features)
Run Code Online (Sandbox Code Playgroud)
当我测试我的模型时:
#add vendor
vendor = Vendor(name="techcrunch", config="vendor config")
vendor.save()
#create features
features = Features(version = 1.0)
features.data = ["5", "89"]
#add article
article = Article(vendor = vendor, url ="http://www.techcrunch.com",
author ="MG Siegler", clean_content = "Apple rocks!")
article.features = features
article.save()
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
TypeError: unbound method _validate() must be called with StringField instance as first argument …Run Code Online (Sandbox Code Playgroud) 在内部,这两个领域之间有什么区别?这些字段在mongo中映射到什么样的模式?此外,如何将具有关系的文档添加到这些字段中?例如,如果我使用
from mongoengine import *
class User(Document):
name = StringField()
class Comment(EmbeddedDocument):
text = StringField()
tag = StringField()
class Post(Document):
title = StringField()
author = ReferenceField(User)
comments = ListField(EmbeddedDocumentField(Comment))
Run Code Online (Sandbox Code Playgroud)
并打电话
>>> some_author = User.objects.get(name="ExampleUserName")
>>> post = Post.objects.get(author=some_author)
>>> post.comments
[]
>>> comment = Comment(text="cool post", tag="django")
>>> comment.save()
>>>
Run Code Online (Sandbox Code Playgroud)
我应该使用post.comments.append(评论)或post.comments + =评论来附加此文档吗?我最初的问题源于对如何处理这个问题的困惑.
是否可以使用python dict更新MongoEngine文档?
例如:
class Pets(EmbeddedDocument):
name = StringField()
class Person(Document):
name = StringField()
address = StringField()
pets = ListField(EmbeddedDocumentField(Pets))
p = Person()
p.update_with_dict({
"name": "Hank",
"address": "Far away",
"pets": [
{
"name": "Scooter"
}
]
})
Run Code Online (Sandbox Code Playgroud) 我有以下型号:
class Like(EmbeddedDocument):
user = ReferenceField(User,dbref=False)
date = DateTimeField(default=datetime.utcnow,required=True)
meta = {'allow_inheritance': False}
class Post(Document):
name = StringField(max_length=120, required=True)
likes = ListField(EmbeddedDocumentField(Like))
Run Code Online (Sandbox Code Playgroud)
我想只过滤超过20个喜欢的帖子(ListField大小超过20).我试过查询使用:
posts = Post.objects.filter(likes__size_gte=20)
posts = Post.objects.filter(likes_gte=20)
posts = Post.objects.filter(likes__gte=20)
posts = Post.objects.filter(likes__size_gte=20)
Run Code Online (Sandbox Code Playgroud)
他们都没有工作.
但如果我使用完全匹配(ListField大小正好20个喜欢)它的工作原理:
posts = Post.objects.filter(likes__size=20)
Run Code Online (Sandbox Code Playgroud)
评论?
我已经搜索了api,但是没有找到任何与删除数据库有关的内容而没有手动迭代这些集合.
是否有更简单的方式db.dropDatabase()通过mongoengine 呼叫?迭代通过想要更简单的方式并不是什么大不了的事.
我希望能够获得我创建的文档所需的列表或某些字段集.例如,这是我的文件:
nickName = StringField(required=True)
password = StringField(required=True)
firstName = StringField()
lastName = StringField()
joinDate = DateTimeField(required=True)
lastVisited = DateTimeField(required=True)
subscriptions = DictField(field=ObjectIdField())
isActivated = BooleanField(default=True)
profileImage = FileField()
isModerator = BooleanField(default=False)
description = StringField()
location = GeoPointField()
email = EmailField()
settings = DictField()
Run Code Online (Sandbox Code Playgroud)
^从这份文件我应该收到:
["nickName","password","joinDate","lastVisited"]
Run Code Online (Sandbox Code Playgroud)
作为必填字段的结果.这可能吗?如果是这样,我怎样才能达到预期的效果.
提前致谢!
如何检查ListField()Mongo类的属性是否未设置或为空?
谢谢!
我一直在寻找mongoengine文档和堆栈溢出,似乎没有一个非常明确的答案,所以我问:你如何最好地查询DictField?示例代码:
class Note(Document):
someData = DictField()
note = Note()
note.someData['someID'] = {"name": "Steve", "age":25}
note.save()
Run Code Online (Sandbox Code Playgroud)
我在文档中找到的最接近的是:
Note.objects(someData__name="Steve")
Run Code Online (Sandbox Code Playgroud)
但这还没有再次起作用,觉得这应该是一个简单的答案.谢谢你的帮助
mongoengine ×10
mongodb ×8
python ×6
bson ×1
dictionary ×1
fastapi ×1
json ×1
listfield ×1
motorengine ×1
pymongo ×1
schema ×1
typeerror ×1