我使用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部分。因此,即使标签不存在,他也总是运行删除部分。有没有其他我可以使用的方法?到目前为止我还没有发现任何东西。
文献的标签字段是一个ListField。例如,标签在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从文献对象中添加标签“deleted”,如果我调用LiteratureTag(2, "test"),它应该用oid=2将标签"test“添加到文献对象。如果我调用LiteratureTag(2, "relevant"),则应该使用oid=2从文献对象中删除”deleted“标签
谢谢
发布于 2020-05-03 02:02:54
我更喜欢你不应该使用try和except。只有当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是有效的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)上面的查询与您的模式完全一致。
https://stackoverflow.com/questions/61425726
复制相似问题