在mongoengine中EmbeddedDocumentField和ReferenceField有什么区别

use*_*508 11 schema json dictionary bson mongoengine

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

tbi*_*icr 10

EmbeddedDocumentField就像父文档的路径一样DictField,存储在mongo中的父文档的一条记录中.

保存EmbeddedDocument只保存父文档.

>>> some_author = User.objects.get(name="ExampleUserName")
>>> post = Post.objects.get(author=some_author)
>>> post.comments
[]
>>> comment = Comment(text="cool post", tag="django")
>>> post.comment.append(comment)
>>> post.save()

>>> post.comment
[<Comment object __unicode__>]

>>> Post.objects.get(author=some_author).comment
[<Comment object __unicode__>]
Run Code Online (Sandbox Code Playgroud)

请参阅文档:https://mongoengine-odm.readthedocs.org/en/latest/guide/defining-documents.html#embedded-documents.

  • 不,用法应完全取决于您的要求。对于“ M:M”,可能最好使用引用列表,例如“用户”与其他“用户”的友谊。对于“ M:1”参考,例如“用户”和他的“帖子”,或嵌入式列表,例如“帖子”和“帖子标签”。对于“ 1:1”参考,例如“用户”和“用户活动页面”,或嵌入的例如“用户”和“用户地址”。但是,此示例在某些特殊情况下可能不好,因此我再次告诉您,如果您自己看不出什么更好,请使用其中一个并在将来重新选择错误时进行重构。 (2认同)