【问题标题】:How can I remove a single element from a mongoDB document?如何从 mongoDB 文档中删除单个元素?
【发布时间】:2021-11-30 11:37:55
【问题描述】:

我有这个代码:

from admin import *
grab_data = tasks_collection.find()

class Habits:
    def __init__(self):
        self.default = False
        self.habits = {}

    def add_habit(self, habit_name, habit_difficulty=0):
        self.habits[habit_name] = [self.default, habit_difficulty]

    def remove_habit(self, habit_name):
        del self.habits[habit_name]

    def plus_habit(self):
        pass

    def minus_habit(self):
        pass

    def add_data(self):
        habits_collection.insert_one(self.habits)


class Tasks:
    def __init__(self):
        self.default = False
        self.tasks = {}

    def add_task(self, task_name, task_difficulty=0):
        if task_name not in self.tasks:
            self.tasks[task_name] = [self.default, task_difficulty]
        else:
            print(f"Task '{task_name}' already exists.")

    def show_task(self):
        return self.tasks

    def remove_task(self, task_name):
        del self.tasks[task_name]


    def add_data(self):
        tasks_collection.insert_one(self.tasks)


task = Tasks()

task.add_task("clean room")

task.add_task("study")
task.add_task("study")

task.add_task("be lazy")
task.add_data()

这基本上用于创建一个包含任务的 ToDo 字典,然后将它们添加到我的数据库中。 到现在为止还挺好。但是如何从数据库中删除单个任务? 当我从数据库中读取数据时,我得到了这个:

{'_id': ObjectId('61a60bbd13d0ccf4e9bb300d'), 'clean room': [False, 0], 'study': [False, 0], 'be lazy': [False, 0]}

我试图像这样删除它:

for data in grab_data:
    for key, value in data.items():
        if key == "be lazy":
            tasks_collection.delete_one({key: value})

但它会删除整个字典。 我怎样才能只删除“偷懒”?

【问题讨论】:

    标签: python python-3.x database mongodb mongodb-query


    【解决方案1】:

    您想使用 $unset 更新运算符,如下所示:

    db.collection.update_many({
      "be lazy": {"$exists": True}
    },
    {
      "$unset": {
        "be lazy": ""
      }
    })
    

    Mongo Playground

    【讨论】:

      【解决方案2】:

      从数据库获取数据时可以使用投影阶段不输出某些字段:

      db.collection.find({},
      {
        "be lazy": 0
      })
      

      例如here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-29
        • 1970-01-01
        • 2021-02-26
        • 1970-01-01
        • 1970-01-01
        • 2020-04-16
        • 2017-04-18
        相关资源
        最近更新 更多