2

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にクエリを実行して、URLが短縮されているかどうかを確認します。私ができる必要があるのは、Bitlyから取得したデータをデータベース内の適切なブログ投稿と照合することです。Bitlyから返されるオブジェクトには、データベース内の適切なブログ投稿を照合して更新するために使用する必要のあるurlフィールドが含まれています。また、一度にblog_urlsのバッチをBitlyに送信することも言う必要がありますが、1つずつ送信することはできません。

blog_postsとBitlyオブジェクトのセットがすべて特定の個人に由来する場合:person = Person.objects.get(name__exact ='BobSmith')

一意のURLフィールドでPersonオブジェクトに埋め込まれている特定のblog_postを選択するにはどうすればよいですか?

一時的なものとして、personオブジェクトのblog_postsを反復処理でき、blog_post.urlがBitlyオブジェクトのURLと一致する場合は、turned_into_bitly_linkフィールドを更新できますが、これが最も効率的かどうかはわかりません。これについて行く方法。

これが理にかなっていることを願っています。明確にさせていただきます。アドバイスをよろしくお願いします。

ベン

4

1 に答える 1

3

位置演算子を使用して、一致した埋め込みドキュメントを更新できます。

テストの例を次に示します(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)
于 2012-06-07T09:09:30.037 に答える