Search code examples
jsondictionaryschemamongoenginebson

What is the difference between EmbeddedDocumentField and ReferenceField in mongoengine


Internally, what are the differences between these two fields? What kind of schema do these fields map to in mongo? Also, how should documents with relations be added to these fields? For example, if I use

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

and call

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

should I use post.comments.append(comment) or post.comments += comment for appending this document? My original question stems from this confusion as to how I should handle this.


Solution

  • EmbeddedDocumentField is just path of parent document like DictField and stored in one record with parent document in mongo.

    To save EmbeddedDocument just save parent document.

    >>> 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__>]
    

    See documentation: http://docs.mongoengine.org/guide/defining-documents.html#embedded-documents.