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.