Ton*_*ell 13 python mongodb pymongo mongoengine
我正在努力使用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
Run Code Online (Sandbox Code Playgroud)
...并且将post对象传递给my_method,我想更新现有帖子,如果它存在于具有匹配uid的self.posts中,或者如果不存在则推送到self.posts.
在mongoengine的一次调用中是否有语法?
Ros*_*oss 15
不使用列表字段,您无法在单个查询中将列表插入到列表中. $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)
Run Code Online (Sandbox Code Playgroud)
首先我们尝试更新,如果它不存在,我们推送到列表 - 这是另一个进程运行并可能推送post列表的机会窗口.
风险可能是可以接受的,但实际上,我认为更改模式会更好,可能会分成Post自己的集合.然后,您可以使用更新语句并设置整个对象.费用将是获取Feed数据的额外查询.