2013-07-03 13 views
8

Intern, was sind die Unterschiede zwischen diesen beiden Feldern? Welche Art von Schema werden diese Felder in Mongo zugeordnet? Wie sollten Dokumente mit Beziehungen zu diesen Feldern hinzugefügt werden? Zum Beispiel, wenn ichWas ist der Unterschied zwischen EmbeddedDocumentField und ReferenceField in Mongoengine

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

verwenden und rufen

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

sollte ich post.comments.append (Kommentar) oder post.comments + = Kommentar für dieses Dokument angehängt? Meine ursprüngliche Frage ergibt sich aus dieser Verwirrung darüber, wie ich damit umgehen soll.

Antwort

9

EmbeddedDocumentField ist nur Pfad des übergeordneten Dokuments wie DictField und in einem Datensatz mit übergeordneten Dokument in Mongo gespeichert.

Um EmbeddedDocument zu speichern, speichern Sie einfach das übergeordnete Dokument.

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

Siehe Dokumentation: https://mongoengine-odm.readthedocs.org/en/latest/guide/defining-documents.html#embedded-documents.

+0

Ich frage mich, ob Sie ein wenig mehr Einblick in den Unterschied zwischen diesen beiden Feldtypen bieten könnten, und welche Anwendungsfälle empfehlen Sie für jeden. Ich möchte die Frage nicht duplizieren, also habe ich gehüpft, Sie können mehr Informationen zu Ihrem hinzufügen. – Alex

+1

'ReferenceField' verweist auf ein anderes Dokument,' EmbeddedDocumentField' ist Teil eines Dokuments. So werden die Beziehungen ManyToMany und ManyToOne besser auf verschiedene Dokumente angewendet, die OneToOne-Beziehung wird mehr auf ein Dokument angewendet. – tbicr

+0

Also für M: M und M: 1 würden Sie 'EmbeddedDocumentField' und für 1: 1' ReferenceField' verwenden. Habe ich das richtig verstanden? – Alex

0

Dies ist nur ein Beispiel, in dem wir eingebettete Dokumente verwenden können.

Sagen wir zum Beispiel, Sie werden eine App erstellen, die Anforderungen aufnimmt und speichert sie in der db. Ihre Anforderung besteht nun darin, diese Anforderung nach einer gewissen Bearbeitung der Anforderung zu einem späteren Zeitpunkt einer Gruppe von Personen zuzuweisen.

Sie müssen auch die Änderungen verfolgen und protokollieren die Aktivität in Bezug auf die Verarbeitung in Bezug auf die Anforderung durchgeführt.

Ich weiß, ich weiß, Sie könnten sagen, wir können RDBMS Art der Beziehung mit Refference-Feld verwenden. aber es beinhaltet die Beseitigung von Obselete-Datensätzen in beiden Sammlungen, die nichts anderes als zusätzlichen Code für die Pflege der Kind-Sammlung im Falle des Löschens des Eltern-Dokuments ist. (Es gibt noch weitere zusätzliche Bemühungen, die an die Stelle treten ..)

Stattdessen eingebettete Dokumente werden als Teil des übergeordneten Dokuments gespeichert. Bei dem übergeordneten Objekt werden auch eingebettete Dokumente berücksichtigt.

und es wird leicht sein, komplexe json-strukturierte Daten mit eingebetteten Dokumenten zu erstellen, anstatt Benutzerlogik zu verwenden, um die Daten in einer komplexen Struktur zu bearbeiten und zu verarbeiten.

Jetzt Hier ist die Beziehung eine Anforderung an viele Handler (die nichts anderes als ein Aktivitätsprotokoll von den Handlern für die eine Anforderung ist).