#python #mongodb #pymongo
Вопрос:
Я вводлю цену биржевого тикера в документ mongodb каждые ~5 минут с помощью pymongo. Подход такой же, как и для датчиков временных рядов в IOT. Моя коллекция инициализируется данными из API.
В документе у меня есть два массива:
- «дата» —gt; где я храню метку времени.
- «котировка» —gt; где я храню цену.
Очевидно, что котировка товара[0] — это цена тикера на дату[0]. Такова логика.
У меня есть еще два важных поля в документе:
- «первый»—gt;, который представляет первую дату в массиве
- «последний» —gt; , который представляет последнюю дату в массиве.
Оба значения инициализируются после первого запроса.
Каждый раз, когда в API запрашивается новое значение, я хотел бы получать значение и дату в своем массиве, но поскольку эта коллекция описывает ДНЕВНУЮ цену, я хотел бы удалить первый элемент в массиве (как для котировки, так и для даты).
Я не знаю, как обращаться с первым и последним элементом. Давайте приведем пример:
date = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # each element is actually a timestamp quote = [10.1, 10.2, 10.3, 10.1, 10.4, 10.5, 10.6, 10.8, 10,9, 10.1] first = 0 last = 10
Всякий раз, когда приходит новая цитата, я хотел бы вставить первый элемент в оба массива, ВВЕСТИ новое значение [дата и цитата] и ОБНОВИТЬ первое и последнее ПОЛЯ моего документа.
Если новый пункт {дата: 11, цитата: 10.5}, я ожидаю:
date = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, **11**] # each element is actually a timestamp quote = [10.2, 10.3, 10.1, 10.4, 10.5, 10.6, 10.8, 10,9, 10.1, **10,5**] first = **1** last = **11**
Это то, что я произвел… очевидно, что это не работает.
for item in data: collection.update({'ticker': item['ticker']}, {"$set": item}, upsert=True) first_date = collection1.find({'ticker': item['ticker']}, {'_id':0, 'first':1}) last_date = collection1.find({'ticker': item['ticker']}, {'_id':0, 'last':1}) print(last_date[0]['last']) print(first_date[0]['first']) collection1.update_many( {'ticker': item['ticker']}, { '$pop':{ 'date':-1, 'quote':-1 }}) collection1.update_many( {'ticker': item['ticker']}, { '$push':{ 'date': item['marketTime']['date'], 'quote': item['price'], }, # '$min' : {'first' : '$date'}, # '$max' : {'last': '$date}, '$inc': {'added_samples': 1} }, upsert=True)
Проблема в том, что первый и последний обновляются с помощью «$дата», на самом деле только первый, потому что «последний» остается инициализированным.
Я надеюсь, что мое объяснение ситуации будет ясным, здесь, чтобы узнать, как справляться с подобными ситуациями.
Пожалуйста, не принимайте во внимание сбор, это моя коллекция котировок, в которой я каждые 5 минут обновляю информацию о тикере. «Проблема» связана с коллекцией1.
Комментарии:
1. Можете ли вы добавить » до » и «после» — то есть то, что вы ожидаете, что произойдет.
2. Отредактированный. Дайте мне знать, если все ясно.