Добавить элемент в массив документов 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) 
  • Почему я получаю pymongo.cursor.Cursor при попытке запросить мой mongodb db через pymongo?
  • MongoDB: как получить db.stats () из API
  • Как сравнить даты с данными Twitter, хранящимися в MongoDB через PyMongo?
  • limit () и sort () порядок pymongo и mongodb
  • pymongo - Невозможно подключиться к mongodb, работающему на EC2
  • ObjectID, сгенерированный сервером на pymongo
  • PyMongo плохо себя ведет с номерами с плавающей запятой
  • Как я могу использовать функции mongo в pymongo?
  • Идентификатор сервера
  • Как получить упорядоченные словари в пимонго?
  • Как улучшить импорт XML в mongodb?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.