若该值已经存在于mongodb中,则将其删除,否则将其添加到列表的末尾(mongoengine)

2024-10-02 18:18:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Mongoengine并希望删除标记(如果存在)。如果标签不存在,我想添加它。但是我的代码没有真正起作用

    try:

        Project.objects.filter(literature__oid=id).update_one(
            pull__literature__S__tags=tag_name)
        print("wanna delete "+tag_name)

    except:
        Project.objects.filter(literature__oid=id).update_one(
            push__literature__S__tags=tag_name)
        print("wanna add"+tag_name)

此代码仅从数据库中删除标记,但如果标记不存在,他不会跳转到except部分。所以他总是运行删除部分,即使标签不存在。有没有其他方法我可以用?到目前为止我还没有找到任何东西

文献的标签字段是一个列表字段。例如,mongoDB中的标记如下所示:

"tags": ["irrelevant", "relevant", "test"]

我的模型基本上是这样的:

class Literature(EmbeddedDocument):
    oid = ObjectIdField(required=True, default=ObjectId,
                        unique=True, primary_key=True, sparse=True)
    tags = ListField() 

class Project(Document):
    project_name = StringField(unique=True, required=True)
    literature = ListField(EmbeddedDocumentField(Literature))

例如,我有一个带oid=1的文学对象,一个带oid=2的文学对象,oid=1有tags=["irrelevant", "test"],oid=2有tags =["relevant"]。我现在想要python函数:

def LiteratureTag(id, tag_name):
    #add tag_name to literature object with the passed id if the tag_name 
    #does't already exist in literature tags and if the tag does exist delete  
    #the tag from the literature object 

因此,例如,如果我调用LiteratureTag(1, "relevant"),它应该从oid=1的文献对象添加标记“相关”,如果我调用LiteratureTag(2, "test"),它应该向oid=2的文献对象添加标记“测试”。如果我调用LiteratureTag(2, "relevant"),标签“relevant”应该从oid=2的文献对象中删除

谢谢


Tags: the对象name标记projectidtruetag
1条回答
网友
1楼 · 发布于 2024-10-02 18:18:35

我希望您不应该使用tryexcept。只有当try块引发错误时,才能进入except。在你的情况下,它不会引起错误。您可以通过检查标记是否存在来尝试编写代码

考虑到您的模式:

class Literature(EmbeddedDocument):
    oid = ObjectIdField(required=True, default=ObjectId,
                        unique=True, primary_key=True, sparse=True)
    tags = ListField() 

class Project(Document):
    project_name = StringField(unique=True, required=True)
    literature = ListField(EmbeddedDocumentField(Literature))

如果您的文献id有效^{,我将编写我的查询:

tag_name=<String> #type string
id=<Object_id> #type objectId


if Project.objects.filter(literature__oid=id,literature__tags__in=[tag_name]):
    #your tag exists, so remove it
    Project.objects.filter(literature__oid=id).update(pull__literature__S__tags=tag_name)
else:
#tag does not exist, push it
    Project.objects.filter(literature__oid=id).update(push__literature__S__tags=tag_name)

上面的查询与您的模式完全一致

相关问题 更多 >