2012-06-06 43 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查询语言的知识。多谢! –

相关问题