Json mongoengine中EmbeddedDocumentField和ReferenceField的区别是什么

Json mongoengine中EmbeddedDocumentField和ReferenceField的区别是什么,json,dictionary,schema,mongoengine,bson,Json,Dictionary,Schema,Mongoengine,Bson,在内部,这两个领域有什么区别?在mongo中,这些字段映射到什么样的模式?此外,应如何将具有关系的文档添加到这些字段中?例如,如果我使用 from mongoengine import * class User(Document): name = StringField() class Comment(EmbeddedDocument): text = StringField() tag = StringField() class Post(Document):

在内部,这两个领域有什么区别?在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)) 
打电话

>>> 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()
>>> 

我应该使用post.comments.append(comment)还是post.comments+=comment来追加此文档?我最初的问题源于我应该如何处理这个问题的困惑。

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__>]
>some\u author=User.objects.get(name=“ExampleUserName”)
>>>post=post.objects.get(author=some\u author)
>>>帖子评论
[]
>>>评论=评论(text=“cool post”,tag=“django”)
>>>post.comment.append(注释)
>>>post.save()
>>>评论
[]
>>>get(author=some\u author).comment
[]

请参阅文档:。

这只是一个示例案例,我们可以在其中使用嵌入式文档

例如,假设您将创建一个应用程序,该应用程序在需求进入时接收需求并将其保存在数据库中。 现在,您的需求是在对需求进行一些处理之后,在稍后的阶段将此需求分配给一群人

您还需要跟踪变更并记录与需求相关的处理相关的活动

我知道,我知道你可能会说,我们可以使用rdbms与引用字段的关系。但它涉及到在两个集合中删除obselete记录,这只是在父文档被删除的情况下处理子集合维护的额外代码。(还有其他额外的工作要做。)

相反,嵌入的文档存储为父文档的一部分。哪个维护父级也将涉及嵌入式文档

使用嵌入式文档创建复杂的json结构化数据将很容易,而不是使用用户逻辑将数据操作和处理成复杂的结构


现在,这里的关系是一个需求与多个处理程序之间的关系(这只是处理程序针对一个需求的活动日志)。

我想知道您是否可以提供更多关于这两种字段类型之间差异的见解,以及您为每种字段类型推荐的使用案例。我不想重复这个问题,所以我希望您可以添加更多信息。
ReferenceField
是对另一个文档的引用,
EmbeddedDocumentField
是一个文档的一部分。因此,多个和多个关系更多地应用于不同的文档,一个关系更多地应用于一个文档。因此,对于M:M和M:1,您将使用
EmbeddedDocumentField
,对于1:1,您将使用
ReferenceField
。我说得对吗?不,用法应该完全取决于你的要求。对于
M:M
可能最好使用引用列表,例如
用户
与另一
用户的友谊
。对于
M:1
参考,例如
用户
及其
帖子
,或嵌入式列表,例如
帖子
帖子标签
。对于
1:1
参考,例如
用户
用户活动页面
,或嵌入式,例如
用户
用户地址
。然而,在一些特殊情况下,这个例子可能不太好,所以我再次告诉大家,这取决于你自己,如果你看不到什么更好的,就用其中的一个,在以后决定选择错误时重构。太好了!伟大的解释大师欧比·万·特比克