2013-02-07 33 views
8

Tôi muốn nối thêm một ListField EmbeddedDocument mới vào một tài liệu ListField EmbeddedDocument hiện có. Nói cách khác, thêm một tài liệu mới vào danh sách thuộc về một tài liệu trong danh sách.Mongoengine: Làm thế nào để nối thêm một tài liệu mới vào một tài liệu ListField nhúng?

My Model: A bài viết có thể chứa một số nhận xét, mỗi bình luận có thể có nhiều Likes:

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) 

Mã của tôi: (nó không làm việc 'thêm' lệnh doesnt tồn tại, chỉ có 'đặt' tồn tại)

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

giải pháp lý tưởng sẽ là một cái gì đó như:

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

Comments? Gợi ý?

Trả lời

4

Bạn muốn $push một mục mới vào danh sách các ví dụ:

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

Tuy nhiên, có những vấn đề lớn ở đây. Lược đồ không lý tưởng - mảng ngày càng phát triển có thể gây ra vấn đề khi tài liệu phát triển nó sẽ phải được di chuyển trên đĩa đến một mức độ mới (vì vậy nó có thể phù hợp), nếu nó liên tục phát triển thì sẽ ảnh hưởng đến hiệu suất.

Xem data modeling docs để biết thêm thông tin.

+0

Cảm ơn $ đẩy hoạt động! – rat

+1

Xin chào, push không hoạt động cho đến khi tôi gọi reload() với cá thể lớp. như product = Product() Product.objects (comments__comment_id = target) .update ( push__comments__S__likes = newLike) product.reload() – Shashank

Các vấn đề liên quan