标签: mongoengine

与原生pymongo使用相比,Mongoengine在大型文档上的速度非常慢

我有以下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列表的字典等等).

我遇到过两个(可能是相关的)问题:

  1. 当我运行本机pymongo find_one()查询时,它会在一秒钟内返回.当我运行MyModel.objects.first()时需要5-10秒.
  2. 当我从数据库查询单个大型文档,然后访问其字段时,只需执行以下操作需要10-20秒:

    m = MyModel.objects.first()
    val = m.data_dict_1.get(some_key)
    
    Run Code Online (Sandbox Code Playgroud)

对象中的数据不包含对任何其他对象的任何引用,因此它不是取消引用的对象的问题.
我怀疑它与mongoengine的内部数据表示的某些低效率有关,这会影响文档对象的构造以及字段访问.我能做些什么来改善这个吗?

python mongodb pymongo mongoengine

12
推荐指数
1
解决办法
3248
查看次数

带有 FastAPI 的 MongoDb

我正在使用FastAPI并希望将其连接到 MongoDB 数据库。然而,我很困惑在异步电机和 mongoengine 之间选择哪个 ODM。此外,在此处的 NoSQL 示例中他们创建了一个新存储桶,并在每次使用时调用了连接到 db 的代码。但是,motor 和 mongoengine 似乎都更喜欢全局连接。那么什么是连接到 mongodb 的好方法呢?

mongodb mongoengine tornado-motor motorengine fastapi

12
推荐指数
2
解决办法
1万
查看次数

EmbeddedDocument中的MongoEngine ListField在验证时抛出TypeError

我不确定它是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)

python typeerror mongodb mongoengine

11
推荐指数
1
解决办法
2178
查看次数

在mongoengine中EmbeddedDocumentField和ReferenceField有什么区别

在内部,这两个领域之间有什么区别?这些字段在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 + =评论来附加此文档吗?我最初的问题源于对如何处理这个问题的困惑.

schema json dictionary bson mongoengine

11
推荐指数
1
解决办法
4596
查看次数

使用python dict更新MongoEngine文档?

是否可以使用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)

python mongodb mongoengine

11
推荐指数
4
解决办法
7925
查看次数

mongoengine - 查询如何按ListField大小过滤

我有以下型号:

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)

评论?

python mongodb mongoengine mongodb-query

10
推荐指数
2
解决办法
5099
查看次数

删除Mongoengine中的所有收藏

我已经搜索了api,但是没有找到任何与删除数据库有关的内容而没有手动迭代这些集合.

是否有更简单的方式db.dropDatabase()通过mongoengine 呼叫?迭代通过想要更简单的方式并不是什么大不了的事.

python mongodb mongoengine

10
推荐指数
1
解决办法
6550
查看次数

从mongoengine的Document获取必填字段?

我希望能够获得我创建的文档所需的列表或某些字段集.例如,这是我的文件:

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)

作为必填字段的结果.这可能吗?如果是这样,我怎样才能达到预期的效果.

提前致谢!

python mongodb mongoengine

9
推荐指数
1
解决办法
4092
查看次数

MongoEngine - 查询 - 如何检查ListField是否为空

如何检查ListField()Mongo类的属性是否未设置或为空?

谢谢!

mongodb listfield mongoengine

9
推荐指数
1
解决办法
7387
查看次数

在MongoEngine中查询DictField的最佳方法

我一直在寻找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

9
推荐指数
1
解决办法
3865
查看次数