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

问题描述 投票:0回答:1

我使用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 部分。因此,即使标签不存在,他也总是运行删除部分。我还有其他方法可以使用吗?到目前为止,我还没有找到任何方法... ...

文献的tags字段是一个ListField。所以tags在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))

例如,我有一个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的标签 "relevant",如果我调用 LiteratureTag(2, "test") 它应该将标签 "test "添加到文献对象中,id=2。如果我调用 LiteratureTag(2, "relevant") 标签 "relevant "应该从文献对象中删除,id=2。

谢谢你

python mongodb flask mongoengine
1个回答
1
投票

我希望你不要使用 tryexcept. 你只进入 except 当你 try 块会引发一个错误。在您的情况下,它不会引发错误。您可以尝试通过检查标签是否存在来编写您的代码。

考虑到你的模式。

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是有效的。Object_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)

以上查询与你的模式完全一致。

© www.soinside.com 2019 - 2024. All rights reserved.