Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更新mongoengine中嵌入文档的列表_Python_Mongodb_Pymongo_Mongoengine - Fatal编程技术网

Python 更新mongoengine中嵌入文档的列表

Python 更新mongoengine中嵌入文档的列表,python,mongodb,pymongo,mongoengine,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 =

我正在努力学习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对象传递到我的_方法后,如果self.posts中存在具有匹配uid的现有post,我想更新它,如果没有,则推送到self.posts


mongoengine中的一次调用中是否有语法可以执行此操作?

否对于列表字段,您无法在单个查询中向上插入列表
$addToSet
不起作用,因为您更改了
帖子
,因此无法匹配。您可以对此进行编码,但它确实会创建一个竞争条件,其中存在一个很小的出错机会窗口,例如:

    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
拆分为自己的集合。然后可以使用update语句设置整个对象。成本将是获取提要数据的额外查询。

@Ross如何使用
mongoengine
获取此响应
WriteResult({“nMatched”:0,“nUpserted”:0,“nModified”:0})
?我想检查是否找到了该物品。谢谢
Feed.objects.filter(posts__uid=post.uid).\
          update_one(push__posts__S__comments='comment demo')