2013-02-07 51 views
8

मैं एक मौजूदा ListField एम्बेडेड दस्तावेज़ को मौजूदा सूची फ़ील्ड एंबेडेड दस्तावेज़ दस्तावेज़ में जोड़ना चाहता हूं। दूसरे शब्दों में सूची में एक दस्तावेज़ से संबंधित सूची में एक नया दस्तावेज़ जोड़ना।Mongoengine: एक एम्बेडेड ListField दस्तावेज़ में एक नया दस्तावेज़ कैसे संलग्न करें?

मेरे मॉडल:

class Post(Document): 
    txt = StringField() 
    comments = ListField(EmbeddedDocumentField(Comment)) 

class Comment(EmbeddedDocument): 
    comment = StringField() 
    comment_id = ObjectIdField() 
    likes = ListField(EmbeddedDocumentField(Like)) 

class Like(EmbeddedDocument): 
    user = ReferenceField(User) 
    date = DateTimeField(default=datetime.utcnow,required=True) 

मेरे कोड:: एक पोस्ट कई टिप्पणियां शामिल कर सकते हैं, प्रत्येक टिप्पणी कई पसंद हो सकता है (यह काम नहीं कर रहा 'संलग्न' कमांड dosen't मौजूद है, केवल 'सेट' मौजूद है)

def appendNewLike(): 
    user = {..} 
    target = ObjectId(commentId) 
    newLike = Like(user=user) 
    Product.objects(comments__comment_id=target).comments.likes.append(newLike) 

टिप्पणियाँ:

def appendNewLike(): 
    user = {..} 
    target = ObjectId(commentId) 
    newLike = Like(user=user) 
    Product.objects(comments__comment_id=target).update(append_comments__S__likes=newLike) 

आदर्श समाधान कुछ की तरह हो सकता है? सुझाव?

Product.objects(comments__comment_id=target).update(
       push__comments__S__likes=newLike) 

हालांकि, वहाँ बड़ा मुद्दों यहां हैं:

उत्तर

4

आप $push को सूची जैसे करने के लिए एक नया आइटम चाहते हैं। स्कीमा आदर्श नहीं है - कभी भी बढ़ते सरणी समस्याएं पैदा कर सकती हैं क्योंकि दस्तावेज़ बढ़ता है, इसे डिस्क पर एक नई सीमा तक ले जाना होगा (इसलिए यह फिट हो सकता है), अगर यह लगातार बढ़ रहा है तो प्रदर्शन पर असर पड़ेगा।

अधिक जानकारी के लिए data modeling docs देखें।

+0

धन्यवाद $ पुश काम करता है! – rat

+1

हैलो, पुश तब तक काम नहीं करता जब तक कि मैं क्लास इंस्टेंस के साथ रीलोड() को कॉल नहीं करता। उत्पाद = उत्पाद() product.objects (टिप्पणियां__comment_id = target) .update ( push__comments__S__likes = newLike) product.reload() – Shashank