在mongoengine中EmbeddedDocumentField和ReferenceField有什么区别

时间:2013-07-03 17:12:40

标签: json dictionary schema mongoengine bson

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

2 个答案:

答案 0 :(得分: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__>]

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

答案 1 :(得分:0)

这只是一个我们可以使用嵌入式文档的示例案例。

让我们举例来说,您将创建一个应用程序,在它们进入时接收需求并将其保存在数据库中。 现在,您的要求是在处理完需求之后的某个阶段将这个需求分配给一群人。

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

我知道我知道你可能会说我们可以使用rdbms与refference字段的关系。但它涉及到删除任何一个集合中的obselete记录,这只是额外的代码,以便在父文档被删除的情况下处理子集合的维护。(还有其他额外的努力到位......)< / p>

而是嵌入式文档存储为父文档的一部分。维护父母也将涉及嵌入式文档。

使用嵌入式文档创建复杂的json结构化数据非常容易,而不是使用用户逻辑来操作和处理数据到复杂的结构中。

现在这里的关系是许多处理程序的一个要求(这只是处理程序对一个要求的活动日志)。