2012-06-06 63 views
2

我在StackOverflow上發現了一些類似的問題,但沒有解決我在找什麼,所以任何幫助將不勝感激。如何對MongoEngine中的ListField中的EmbeddedDocument進行原子更新?

我的模型:

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) 

對於每個blogpost.blog_url,我查詢Bitly API,看看如果URL已縮短。我需要做的是將我從Bitly獲得的數據與我的數據庫中相應的博客帖子進行匹配。我從Bitly返回的對象包含一個url字段,我需要使用它來匹配和更新數據庫中相應的blogpost。還應該說我一次發送一批blog_urls給Bitly,一個接一個不是一個選項。

給定一組blog_posts和Bitly對象從特定個體所產生的所有: 人= Person.objects.get(name__exact =「BobSmith」)

如何選擇嵌入我的Person對象的具體blog_post由唯一的網址字段?作爲一個權宜之計,我想我可以迭代我的person對象中的blog_posts,並且如果blog_post.url與我的Bitly對象中的URL匹配,那麼我可以更新turns_into_bitly_link字段,但我不確定這是什麼是解決這個問題的最有效的方法。

希望這是有道理的。我很樂意澄清,並且提前感謝您的任何建議。

+0

Hmmmm。請閱讀* [MongoDB&Pyhon] [1] *中的第3章,並意識到我應該考慮使用pymongo查詢並自動更新我的db。在我看來,與mongoongine的查詢操作相比,語法更易於閱讀,特別是嵌入式文檔。 [1]:http://shop.oreilly.com/product/0636920021513.do –

+0

我把這個作爲我的答案,但唉,stackoverflow還沒有委託給我這個特權。 –

回答

2

您可以使用位置運算符來更新匹配的嵌入式文檔。

下面有從測試的例子(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查詢語言的知識。多謝! –

相關問題