Pymongo: Я хотел бы обновить первое и последнее поле моего документа, используя $min и $max после операции $push/$pop

#python #mongodb #pymongo

Вопрос:

Я вводлю цену биржевого тикера в документ mongodb каждые ~5 минут с помощью pymongo. Подход такой же, как и для датчиков временных рядов в IOT. Моя коллекция инициализируется данными из API.

В документе у меня есть два массива:

  1. «дата» —gt; где я храню метку времени.
  2. «котировка» —gt; где я храню цену.

Очевидно, что котировка товара[0] — это цена тикера на дату[0]. Такова логика.

У меня есть еще два важных поля в документе:

  1. «первый»—gt;, который представляет первую дату в массиве
  2. «последний» —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. Отредактированный. Дайте мне знать, если все ясно.