我使用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。
谢谢你
我希望你不要使用 try
和 except
. 你只进入 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)
以上查询与你的模式完全一致。