नहीं सूची फ़ील्ड के साथ आप किसी एकल क्वेरी में सूची में अप्सर्ट नहीं कर सकते हैं। $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
अपने संग्रह में बाहर। फिर आप एक अद्यतन कथन का उपयोग कर सकते हैं और पूरी वस्तु सेट कर सकते हैं। फ़ीड डेटा प्राप्त करने के लिए लागत एक अतिरिक्त क्वेरी होगी।