在mongodb python上基于日期上传和过滤一个年龄。

问题描述 投票:0回答:1

我想把用户的日期上传到我的数据库中,不管是Date还是String的格式,然后我想查询用户,并对所有的日期进行$lte和$gte查询,以找到特定年龄范围的用户(例如:25-30)。然后我想查询用户,并对所有日期进行$lte和$gte查询,以找到特定年龄范围的用户(例如:25-30),但我目前遇到的问题是这样的。

如果我对29岁的用户进行查询,比如说我有

    User1: birthday: 21st May 1991 
    User2: birthday:  21st September 1991

如果今天是例如2020年6月12日,它给我两个用户(User1和User2),但它应该只给我User1,因为他有29岁,而User2将在几个月内29岁。谁能帮我找到一个解决方案或提出一个解决方案?谢谢你

我目前的代码。

    ageRangeFirst = 29
    ageRangeSecond = 31
    current_year = int(datetime.now().year)
    newFirstAge = current_year - ageRangeFirst
    newSecondAge = current_year - ageRangeSecond
    filter['dateOfBirth'] = {"$lte": '{}1231'.format(newFirstAge), "$gte": '{}0101'.format(newSecondAge)} 

在数据库中,我将日期保存为字符串格式。

   "dateOfBirth" : "19911201" //yyyyDDmm as String

我知道我现在的方法应该会得到一个结果,但我需要更好的日期和年龄查询和管理。

谢谢你的帮助

python mongodb mongoose mongodb-query pymongo
1个回答
0
投票
    def addZeroToNumber(number):
        if number < 10:
          return '0{}'.format(number)
        else:
          return str(number)

    def checkTheAge():
        ageRangeFirst = int(request.get_json()['ageRangeFirst'])
        ageRangeSecond = int(request.get_json()['ageRangeSecond'])
        current_year = int(datetime.now().year)
        current_month = int(datetime.now().month)
        current_day = int(datetime.now().day)
        print(current_year, addZeroToNumber(current_month), addZeroToNumber(current_day))
        newFirstAge = current_year - ageRangeFirst
        newSecondAge = current_year - ageRangeSecond - 1

        date1Filter = datetime.strptime('{}-{}-{}T00:00:00.000Z'.format(newSecondAge, addZeroToNumber(current_month), addZeroToNumber(current_day)), "%Y-%m-%dT%H:%M:%S.%fZ") #19
        date2Filter = datetime.strptime('{}-{}-{}T00:00:00.000Z'.format(newFirstAge, addZeroToNumber(current_month), addZeroToNumber(current_day)), "%Y-%m-%dT%H:%M:%S.%fZ")  #17
        print(date1Filter)
        print(date2Filter)
        filter['dateOfBirth'] = {"$gte": date1Filter, "$lte": date2Filter}
© www.soinside.com 2019 - 2024. All rights reserved.