2015-05-10 6 views
1

У меня есть структура mongdb которая выглядит следующим образом:используя запись MongoDB при обновлении

{'_id':1, 'aggregate_sum': 12, 'total':10, 'mean':1.2} 

Я хочу, чтобы обновить среднее значение этой базы данных.

num =12 
value = db.find_one({'_id':1}) 
new_mean = (value['mean']*value['total'] + num)/(value['total']+1) 
db.update({'_id':1, {'$inc':{'aggregate_sum':num, 'total':1},{"$set" :{'mean':new_mean}) 

Могу ли я предотвратить первый звонок манго и вместо этого обновить среднее значение на лету. Я думаю о некоторой ссылке на текущий объект mongodb, обрабатываемый как this в javascript?

+0

Не знаю драйвер Python, но, возможно, [ 'findAndModify'] (http://docs.mongodb.org/manual /reference/method/db.collection.findAndModify/) - это то, что вы ищете - [которое можно использовать в pymongo] (http://api.mongodb.org/python/current/api/pymongo/collection.html# pymongo.collection.Collection.find_and_modify). Тем не менее, возможно, [структура агрегации] (http://docs.mongodb.org/manual/aggregation/). –

ответ

1

В настоящее время вы не можете ссылаться на другое поле в рамках обновления (пока). Вы можете попробовать перебором документов и обновлять каждый документ затем вызовите метод сохранения:

num = 12 
for value in db.find({'_id': 1}): 
    new_mean = (value['mean']*value['total'] + num)/(value['total'] + 1) 
    value['aggregate_sum'] += num 
    value['total'] += 1 
    value['mean'] = new_mean 
    db.save(value) 
Смежные вопросы