MongoDB: удаление значения массива из нескольких документов в одной коллекции с помощью pymongo

#arrays #mongodb #flask #mongodb-query #pymongo

Вопрос:

Всего хорошего. Я надеюсь, что вы сможете помочь с одной проблемой. Я использую приложение для создания колбы и использую pymongo, и мне нужно удалить единственное значение массива из нескольких массивов во многих документах в одной коллекции. У меня есть документы рецептов в коллекции «рецепты», и в каждом из них есть массив («категория»), длина которого может составлять от 1 до 3 значений. У меня есть функция, доступная в разделе «администратор» моего сайта, которая позволяет удалять категорию из коллекции «категории», и поэтому для этого я хочу удалить любые экземпляры значения этой категории в массиве «категория» в любом документе рецепта в коллекции рецептов.

Мне удалось сделать это в одном документе:

 mongo.db.recipes.update(
        {"_id": ObjectId("60df2eec9df14e58d0c698c8")},
        {"$pull": {"category": category_id}}
    )
 

но мне не удалось сделать это для коллекции в целом, я решил, что мне нужно использовать $all с оператором $pull для коллекции, используя запрос «update_many», и до сих пор пытался:

 mongo.db.recipes.update_many({"category": {"$all": {"$pull": {"category": category_id}}}})

mongo.db.recipes.update_many({"$all": {"$pull": {"category": category_id}}})

mongo.db.recipes.update_many({"category": {"$pullAll": {"category": category_id}}})
 

Ни один из них не работает. Я продолжаю получать сообщение об ошибке:

 TypeError: update_many() missing 1 required positional argument: 'update'
 

Любая помощь будет признательна.

Ответ №1:

Прочитайте — https://pymongo.readthedocs.io/en/stable/api/pymongo/collection.html?выделите=update_many#pymongo.коллекция.Коллекция.update_many

1-й параметр-фильтр, который будет {} , если вы хотите обновить весь документ

 mongo.db.recipes.update_many(
  {} // filter filter,
  {} // update
)
 

 mongo.db.recipes.update_many({ }, {"$pull": {"category": category_id}})
 

Комментарии:

1. Спасибо, что ответили Тушару, я попробовал это как: mongo.db.recipes.update_many({"$filter": {input: "category"}}, {"$all": {"$pull": {"category": category_id}}}) и не повезло — какой был бы правильный синтаксис?

2. у вас есть документы с ключом input ?

3. Ключом для массива является «категория», которая может иметь до трех значений. Я попробовал то, что вы предложили, и получил ошибку pymongo.errors. Ошибка записи: Неизвестный модификатор: $все. Ожидаемый допустимый модификатор обновления или обновление в стиле конвейера, указанное в виде массива, полная ошибка: {«индекс»: 0, «код»: 9, «errmsg»: «Неизвестный модификатор: $все. Ожидаемый допустимый модификатор обновления или обновление в стиле конвейера, указанное в виде массива’}

4. Поэтому я попробовал: 1) mongo.db.recipes.update_many({«ввод»: «категория»}, {«$pull»: {«категория»: идентификатор категории}})

5. просто попробовал это: mongo.db.recipes.update_many({ }, {«$pull»: {«категория»: идентификатор категории}}), и это сработало, судя по всему!