如何使用mongoengine for Python在MongoDB中upsert一个文档?

sdnqo3pr  于 2023-02-21  发布在  Go
关注(0)|答案(1)|浏览(145)
    • bounty将在6天后过期**。回答此问题可获得+50的声誉奖励。rebellion正在寻找来自声誉良好来源的答案

我很难找到如何使用mongoengine在MongoDB中upsert。
我当前的插入代码如下所示:

for issue in data['issues']:

    doc = Issue(
        key=issue['key'],
        title=issue["fields"]["summary"],
        type=issue["fields"]["issuetype"]["name"],
        status=issue["fields"]["status"]["name"],
        assignee=issue["fields"]["assignee"]["displayName"] if issue["fields"]["assignee"] else None,
        labels=issue["fields"]["labels"],
        components=[c['name'] for c in issue["fields"]["components"]],
        storypoints=int(issue["fields"]["customfield_10002"]) if issue["fields"]["customfield_10002"] else 0,
        sprints=[x['name'] for x in sprint_dict] if sprint_dict != None else None,
        updated_at=datetime.utcnow(),
        created=issue["fields"]["created"]
    )
    
    doc.save()

这当然只是保存,但我已经尝试了这么多的update的变种与upsert=True等,我发现,他们没有一个工作。

kq4fsx7k

kq4fsx7k1#

在这里https://docs.mongoengine.org/apireference.html#mongoengine.queryset.QuerySet.update_one
假设唯一ID为key,并且您希望在更新时覆盖所有字段,则它必须为

Issue.objects(key=issue['key']).update_one(upsert=True,
    set__key=issue['key']
    set__title=issue["fields"]["summary"],
    set__type=issue["fields"]["issuetype"]["name"],
    set__status=issue["fields"]["status"]["name"],
    set__assignee=issue["fields"]["assignee"]["displayName"] if issue["fields"]["assignee"] else None,
    set__labels=issue["fields"]["labels"],
    set__components=[c['name'] for c in issue["fields"]["components"]],
    set__storypoints=int(issue["fields"]["customfield_10002"]) if issue["fields"]["customfield_10002"] else 0,
    set__sprints=[x['name'] for x in sprint_dict] if sprint_dict != None else None,
    set__updated_at=datetime.utcnow(),
    set__created=issue["fields"]["created"]
)

组件和sprint似乎是列表,因此如果要添加到列表中而不是覆盖它们,则应使用

push_all__components=[c['name'] for c in issue["fields"]["components"]]
push_all__sprints=[x['name'] for x in sprint_dict] if sprint_dict != None else []

所有修改器列表如下所示:https://docs.mongoengine.org/apireference.html#mongoengine.queryset.QuerySet.update_one选择适合你的广告创意的广告。

相关问题