我在StackOverflow上发现了一些类似的问题,但没有解决我正在寻找的问题,所以任何帮助都会受到赞赏。
我的模特:
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以查看网址是否已被缩短。我需要做的是将我从Bitly获得的数据与我数据库中相应的博客帖子进行匹配。我从Bitly返回的对象包含一个url字段,我需要用它来匹配和更新我的数据库中的相应blogpost。还应该说我一次向Bitly发送一批blog_urls,逐个不是一个选项。
给定一组blog_posts和Bitly对象都来自给定的个体: person = Person.objects.get(name__exact ='BobSmith')
如何通过唯一的URL字段选择我的Person对象中嵌入的特定blog_post?
作为权宜之计,我想我可以迭代我的person对象中的blog_posts,如果blog_post.url与我的Bitly对象中的URL匹配,我可以更新turns_into_bitly_link字段,但我不确定这是最有效的方法。
希望这是有道理的。我很乐意澄清,并提前感谢任何建议。
本
答案 0 :(得分: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)