У меня есть массив, хранящийся в каждом документе/записи в базе данных mongo, и мне нужно вычислить оценку для каждого элемента в этом массиве и агрегировать оценки по другому полю элемента массива.Агрегирование записей в Mongo через массив
Мне сложно объяснить, что я пытаюсь сделать на английском, поэтому вот пример python того, что я ищу.
records = [
{"state": "a", "initvalue": 1, "data": [{"time": 1, "value": 2}, {"time": 2, "value": 4}]},
{"state": "a", "initvalue": 5, "data": [{"time": 1, "value": 7}, {"time": 2, "value": 9}]},
{"state": "b", "initvalue": 4, "data": [{"time": 1, "value": 2}, {"time": 2, "value": 1}]},
{"state": "b", "initvalue": 5, "data": [{"time": 1, "value": 3}, {"time": 2, "value": 2}]}
]
def sign(record):
return 1 if record["state"] == "a" else -1
def score(record):
return [{"time": element["time"], "score": sign(record) * (element["value"] - record["initvalue"])} for element in record["data"]]
scores = []
for record in records:
scores += score(record)
sums = {}
for score in scores:
if score["time"] not in sums:
sums[score["time"]] = 0
sums[score["time"]] += score["score"]
print '{:>4} {:>5}'.format('time', 'score')
for time, value in sums.iteritems():
print '{:>4} {:>5}'.format(time, value)
Это вычисляет несколько иную функцию оценки для состояния a
и для состояния b
, а затем агрегирует баллы по каждому входу времени.
Вот результат
time score
1 7
2 13
Я пытаюсь выяснить, как сделать это в Монго, не вытягивая записи в питон и изобретать агрегацию.
Спасибо за помощь!
Если у вас возникли проблемы с пониманием выше команды, это может помочь. Комбинированная функция представляет собой массив («конвейер») команд. Попробуйте удалить команды из конца массива и посмотреть, как изменяется промежуточный результат. – Jon