Как определить очень специфический фильтр для метода обновления в PyMongo - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть очень специфический запрос в моем проекте, который возвращает мне документ с наименьшей датой:

   data = collection.find({'status': 'to_be_posted'}).sort('creation_date', pymongo.ASCENDING).limit(1)[0]

Но теперь у меня проблема с обновлением документов, соответствующих этому запросу. Нечто подобное просто не работает:

collection.update( { 'status' : 'to_be_posted' },
           { '$set' : {
               'status' : 'posted'
           },
           { array_filters: [{ $group : { _id: null, max: { $max : "$creation_date" }}}]
           } } )

... или что-то в этом роде:

collection.update( {'status': 'to_be_posted'}.sort('creation_date', pymongo.ASCENDING).limit(1),
           { '$set' : {
               'status' : 'posted'
           } } )

Мне нужно обновить документ с самой низкой датой и статусом «to_be_posted» до статуса «опубликовано». Я понятия не имею, как написать правильный фильтр запросов для такого метода обновления. Какие операторы мне следует использовать? Могу ли я использовать модификаторы запросов?

1 Ответ

0 голосов
/ 11 сентября 2018

pymongo.collection.Collection.find_one_and_update может использоваться для выполнения поиска и обновления запроса в целом.

Параметры

filter: запрос, соответствующий документу для обновления.

update: применяемые операции обновления.

projection (необязательно): список имен полей, которые должны быть возвращается в итоговый документ или отображение, указывающее поля включить или исключить. Если projection список, _id будет всегда будет возвращен. Используйте dict для исключения полей из результат (например, projection = {'_ id': False}).

sort (необязательно): список пар (ключ, направление) указание порядка сортировки для запроса. Если несколько документов совпадают с запросом, они сортируются, а первый обновляется.

upsert (необязательно): когда True, вставляет новый документ, если нет документ соответствует запросу. По умолчанию False.

return_document: если : attr: ReturnDocument.BEFORE (по умолчанию), возвращает исходный документ до его обновления или None если ни один документ не соответствует. Если : attr: ReturnDocument.AFTER, возвращает обновленный или вставленный документ.

array_filters (необязательно): список фильтров, определяющих, какие элементы массива, к которым должно применяться обновление. Требуется MongoDB 3.6 +.

session (необязательно): a : Класс:. ~pymongo.client_session.ClientSession 1039 *

**kwargs (необязательно): могут быть переданы дополнительные аргументы команды в качестве аргументов ключевых слов (например, maxTimeMS может использоваться с последние версии сервера).

import pymongo
from pymongo.collection import ReturnDocument

filter = {'status': 'to_be_posted'}
update = {'$set': {'status' : 'posted'}}
sort = [('creation_date', pymongo.ASCENDING)]
updated_doc = collection.find_one_and_update(
                  filter, update, sort=sort, 
                  return_document=ReturnDocument.AFTER
              )
...