MongoDB - Upsert с приращением - PullRequest
       7

MongoDB - Upsert с приращением

9 голосов
/ 24 октября 2011

Я пытаюсь выполнить следующий запрос:

data = {
    'user_id':1,
    'text':'Lorem ipsum',
    '$inc':{'count':1}, 
    '$set':{'updated':datetime.now()},
}
self.db.collection('collection').update({'user_id':1}, data, upsert=True)

но два запроса '$' приводят к сбою. Возможно ли сделать это в одном утверждении?

1 Ответ

15 голосов
/ 24 октября 2011

Прежде всего, когда вы задаете такой вопрос, очень полезно добавить информацию о причине его сбоя (например, скопировать ошибку).

Ваш запрос не выполняется, потому что вы смешиваете $ operator с переопределением документа,Вы должны использовать оператор $ set для user_id и текстовых полей (хотя часть user_id в вашем обновлении не имеет значения в этом примере).

Так что конвертируйте это в запрос pymongo:

db.test.update({user_id:1}, 
    {$set:{text:"Lorem ipsum", updated:new Date()}, $inc:{count:1}}, 
    true, 
    false)

Я удалил user_id в обновлении, потому что это не нужно.Если документ существует, это значение будет уже равно 1. Если он не существует, upsert скопирует часть запроса вашего обновления в новый документ.

...