2012-06-06 1 views
2

StackOverflow에 대한 비슷한 질문이 있지만 찾으려는 내용이 없으므로 도움을 얻을 수 있습니다.MongoEngine의 ListField에서 EmbeddedDocument에 대한 원자 적 업데이트를 수행하는 방법은 무엇입니까?

내 모델 : 각 blogpost.blog_url를 들어

class BlogPost(EmbeddedDocument): 
    title = StringField(required=True) 
    blog_url = StringField(required=True, unique=True) 
    content = StringField() 
    turned_into_bitly_link = BooleanField(default=False) 

class Person(Document): 
    name = StringField 
    blog_posts = ListField(EmbeddedDocumentField(BlogPost), default=list) 

, 나는 URL이 단축되어 있는지 확인하기 위해 Bitly API를 쿼리합니다. 내가 할 수 있기를 바란다는 것은 Bitly에서 얻은 데이터를 내 데이터베이스의 적절한 블로그 포스트와 대조하는 것입니다. Bitly에서 가져온 개체에는 내 데이터베이스에서 해당 blogpost를 일치시키고 업데이트하는 데 사용해야하는 URL 필드가 들어 있습니다. 한 번에 하나씩 Bitly에 일괄 적으로 blog_urls를 보내야한다고 말하면됩니다.

는 blog_posts의 집합을 감안할 때 Bitly 모든 주어진 개인에 따른 객체 : 사람 = Person.objects.get (name__exact = 'BobSmith') 내 Person 객체에 포함 된 특정 blog_post을 선택할 수있는 방법

고유 한 URL 필드에 의해?

임시 방편으로, 내 person 객체의 blog_posts를 반복 할 수 있고 blog_post.url이 내 Bitly 객체의 URL과 일치하면 turns_into_bitly_link 필드를 업데이트 할 수 있지만 이것에 대해 가장 효율적인 방법입니다.

희망적입니다. 명확히하고 기쁜 마음으로 미리 조언 해 주셔서 감사합니다.

+0

흠. * [MongoDB & Pyhon] [1] *에서 3 장을 읽으십시오. 필자는 pymongo 쿼리를 사용하고 db를 원자 적으로 업데이트하는 것을 고려해야합니다. 필자의 눈에는 구문이 특히 mongoongine의 쿼리 작업보다 쉽게 ​​읽을 수 있습니다. [1] : http://shop.oreilly.com/product/0636920021513.do –

+0

나는 이것을 내 대답으로 넣었지만, 아아, stackoverflow는 아직 그 특권을 내게 맡기지 않았다. –

답변

2

일치 연산자를 사용하여 일치하는 포함 된 문서를 업데이트 할 수 있습니다.

Heres는 시험에서 예 (https://github.com/MongoEngine/mongoengine/blob/master/tests/test_queryset.py#L313)

def test_update_using_positional_operator(self): 
    """Ensure that the list fields can be updated using the positional 
    operator.""" 

    class Comment(EmbeddedDocument): 
     by = StringField() 
     votes = IntField() 

    class BlogPost(Document): 
     title = StringField() 
     comments = ListField(EmbeddedDocumentField(Comment)) 

    BlogPost.drop_collection() 

    c1 = Comment(by="joe", votes=3) 
    c2 = Comment(by="jane", votes=7) 

    BlogPost(title="ABC", comments=[c1, c2]).save() 

    BlogPost.objects(comments__by="jane").update(inc__comments__S__votes=1) 

    post = BlogPost.objects.first() 
    self.assertEquals(post.comments[1].by, 'jane') 
    self.assertEquals(post.comments[1].votes, 8) 
+0

고마워요, 로스. 이것은 아주 도움이되었다. 나는 MongoDB 쿼리 언어에 대해 배우기에 좋은 점이있다. 감사합니다! –