Добавить элемент в массив документов MongoDB в PyMongo без повторной установки

Я использую MongoDB как базовую базу данных для веб-приложения Python (PyMongo + Bottle). Пользователи могут загружать файлы и, при необходимости, «тегировать» эти файлы во время загрузки. Теги хранятся в виде списка внутри документа, как показано ниже:

{ "_id" : ObjectId("561c199e038e42b10956e3fc"), "tags" : [ "tag1", "tag2", "tag3" ], "ref" : "4780" } 

Я пытаюсь разрешить пользователям добавлять новые теги в любой документ. Я придумал что-то вроде этого:

 def update_tags(ref, new_tag) # fetch desired document by ref key as dict document = dict(coll.find_one({'ref': ref})) # append new tag document['tags'].append(new_tag) # re-insert the document back into mongo coll.update(document) 

(fyi; ключ ref всегда уникален, и это тоже может быть легко.) Кажется, должен быть способ просто обновить значение «теги» напрямую, не отрывая весь документ и повторно вставляя его. Я что-то упустил?

Любые мысли очень ценятся 🙂

2 Solutions collect form web for “Добавить элемент в массив документов MongoDB в PyMongo без повторной установки”

Вам не нужно использовать для извлечения документа сначала, просто используйте метод .update с оператором $push .

 def update_tags(ref, new_tag): coll.update({'ref': ref}, {'$push': {'tags': new_tag}}) 

Поскольку обновление устарело, вы должны использовать метод find_one_and_update или update_one если используете pymongo 2.9 или новее

Просто чтобы добавить к @ssytvane ответ и ответить @Guarav: вы можете добавить «upsert = True», если он не существует:

 def update_tags(ref, new_tag): coll.update({'ref': ref}, {'$push': {'tags': new_tag}}, upsert = True) 

или

 def update_tags(ref, new_tag): coll.update_one({'ref': ref}, {'$push': {'tags': new_tag}}, upsert = True) 
  • Объект документа MongoEngine, созданный с использованием функции from_json, не сохраняет
  • Запрос Mongodb по месяцам, дням, годам ... datetime
  • Pymongo дает отказ от db-утверждения при попытке доступа к удаленному серверу
  • Вычислить производные первого порядка с системой агрегации MongoDB
  • Получить массив строк из запроса Pymongo
  • Обновление списка встроенных документов в mongoengine
  • Как продолжить вставку после повторной ошибки ключа с помощью PyMongo
  • поиск по ObjectId в mongodb с pymongo
  • Python - лучший язык программирования в мире.