いいえ、リストフィールドでは、1回のクエリでリストにアップサートすることはできません。 $addToSet
post
を変更したため、機能しません だからあなたは一致することはできません。これをコード化することはできますが、エラーが発生する可能性のある小さなウィンドウがある競合状態が作成されます。例:
class Post(EmbeddedDocument):
uid = StringField(required=True)
text = StringField(required=True)
class Feed(Document):
label = StringField(required=True)
feed_url = StringField(required=True)
posts = ListField(EmbeddedDocumentField(Post))
Feed.drop_collection()
Feed(
label="label",
feed_url="www.feed.com"
).save()
post = Post(uid='1', text="hi")
updated = Feed.objects(posts__uid=post.uid).update_one(set__posts__S=post)
if not updated:
Feed.objects.update_one(push__posts=post)
最初に更新を試み、それが存在しない場合はリストにプッシュします。これは、別のプロセスを実行してpost
をプッシュする機会がある場所です。 リストに載っています。
リスクは許容できるかもしれませんが、現実的には、スキーマを変更する方が良いと思います。Post
を分割する可能性があります。 独自のコレクションに。次に、updateステートメントを使用して、オブジェクト全体を設定できます。費用は、フィードデータを取得するための追加のクエリになります。