我正在努力解决 mongoengine 语法。
我有以下型号...
class Post(EmbeddedDocument):
uid = StringField(required=True)
text = StringField(required=True)
when = DateTimeField(required=True)
class Feed(Document):
label = StringField(required=True)
feed_url = StringField(required=True)
posts = ListField(EmbeddedDocumentField(Post))
def my_method(self, post):
pass
...并且将 post 对象传递到 my_method 中,如果现有帖子存在于 self.posts 中并具有匹配的 uid,我想更新它,或者如果不存在,则推送到 self.posts 。
是否有语法可以在 mongoengine 的一次调用中执行此操作?
否,对于列表字段,您无法在单个查询中将更新插入到列表中。$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
进入自己的收藏。然后您可以使用更新语句并设置整个对象。成本将是获取提要数据的额外查询。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)