首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果mongodb中已经存在值,则将其删除,否则将其添加到列表末尾(mongoengine)

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

Stack Overflow用户
提问于 2020-04-25 20:35:27
回答 1查看 251关注 0票数 0

我使用Mongoengine,如果标签存在,我想删除它。如果标签不存在,我想添加它。但是我的代码并不是真的在工作。

代码语言:javascript
复制
    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部分。因此,即使标签不存在,他也总是运行删除部分。有没有其他我可以使用的方法?到目前为止我还没有发现任何东西。

文献的标签字段是一个ListField。例如,标签在mongoDB中看起来就像这样:

代码语言:javascript
复制
"tags": ["irrelevant", "relevant", "test"]

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

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
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从文献对象中添加标签“deleted”,如果我调用LiteratureTag(2, "test"),它应该用oid=2将标签"test“添加到文献对象。如果我调用LiteratureTag(2, "relevant"),则应该使用oid=2从文献对象中删除”deleted“标签

谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-05-03 02:02:54

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

考虑到您的模式:

代码语言:javascript
复制
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,我将编写我的查询

代码语言:javascript
复制
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)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61425726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档