PyMongo — удалять документы на основе условия даты, при котором дата сохраняется в строковом формате (%m / %d /%y) в MongoDB

#json #mongodb #python-requests #pymongo

#json #mongodb #python-запросы #pymongo

Вопрос:

Как удалить документы Mongodb на основе определенного условия даты, используя PyMongo, который хранит объект date в строковом формате в MongoDB?

Пример кода:

API принимает параметр даты в качестве полезной нагрузки и возвращает только такой объем данных.Поэтому перед вставкой новых документов убедитесь, что предыдущие данные не удалены, а только те, которые обрабатываются в данный момент.

 import requests
import json
from pymongo import MongoClient
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta

past_4_month= datetime.today()   relativedelta(months=-4)
past_4_month_1st_day=past_4_month.strftime("%m/01/%Y")

url='xxx'
header={'Auth':'xyz', 'Content-Type': 'application/json'}
payload={'start_date': past_4_month_1st_day }
api_data = requests.request("POST", url, data=json.dumps(payload), headers=header).json()

client = MongoClient('mongodb://localhost:27017') 
db = client[test_db][test_collection]

db.delete_many({'date':{'$gte':past_4_month_1st_day}})

db.insert_many(api_data)

client.close()
  

Пример вывода, сохраненный в mongodb:

 {
 "id": ObjectId("5f44e33ffb3be4ed19a10ed3"), 
 "xyz_id" : "12345", 
 "name" : "xyz", 
 "date" : "3/3/2020"
}
  

Например, при запуске в августе 2020 года он будет возвращать данные за последние 4 месяца, т. Е. с мая 2020 года, и всегда усекать / удалять и загружать одни и те же данные до конца августа 2020 года.

1 сентября 2020 года 1-го числа месяца предыдущей датой 4 месяца будет июнь 2020 года, поэтому не следует удалять данные за май 2020 года, но только с июня 2020 года по текущий месяц (сентябрь 2020). Это означает, что при каждом запуске обрабатываются только данные за последние 4 месяца (усечение / удаление и перезагрузка).

Однако, поскольку дата хранится в виде строки в документе MongoDB, попробовал преобразовать ее в дату из строки, используя $dateFromString , $ToDate и в Python и т.д. он по-прежнему работает не так, как ожидалось, и удаляет все документы (с мая 2020 года) из предыдущих запусков / загрузок.

Пожалуйста, предложите.

Комментарии:

1. Добавьте в свои документы другое поле, в котором дата хранится разумно (либо с использованием синтаксиса ГГГГ-ММ-ДД, либо с использованием фактической метки времени), затем используйте это поле для запросов.

2. это могло бы быть обходным путем, но я искал идеальное решение.

3. Я уверен, что можно создавать регулярные выражения, которые соответствовали бы диапазонам дат m / d / y.