Tidak dengan bidang daftar, Anda tidak dapat melakukan penyisipan ke dalam daftar dalam satu kueri. $addToSet tidak akan berfungsi karena Anda telah mengubah post jadi kamu tidak bisa menandingi. Anda dapat mengkodekan hal ini tetapi ini menciptakan kondisi balapan di mana ada sedikit peluang untuk kesalahan, misalnya:
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)
Pertama kami mencoba memperbarui dan jika tidak ada, kami mendorong ke daftar - ini adalah di mana ada jendela peluang untuk proses lain untuk berjalan dan berpotensi mendorong post dalam daftar.
Risikonya mungkin dapat diterima tetapi secara realistis, saya pikir mengubah skema Anda lebih baik, berpotensi memecah Post keluar menjadi koleksinya sendiri. Kemudian Anda dapat menggunakan pernyataan pembaruan dan mengatur seluruh objek. Biayanya akan menjadi kueri tambahan untuk mendapatkan data umpan.