如何在Python中搜索MongoDB ISODate字段?

时间:2015-07-30 11:37:56

标签: python django mongodb pymongo mongoengine

我有一个API,我从中接收查询。这个API是Python。

我从django app(views.py)中调用它。然后,我想使用mongoengine查询我的MongoDB集合:

api_response = requests.get("http://*******", {'query':query}) #We call the API
json_resp = api_response.json()
person = Person.objects(__raw__=json_resp).to_json() #We search for the json_query in the DB (raw) and the output is JSON

它工作正常,但我的日期有问题......的确,我的Person模型如下:

class Person(DynamicDocument):

    # Meta Variables
    meta = {
        'collection':'personsExample'
        }

    #Document variables
    PersonID = models.CharField(max_length = 6)
    FirstName = models.CharField(max_length = 50)
    LastName = models.CharField(max_length = 50)
    Gender = models.CharField(max_length = 6) #male/female
    BirthDate = models.DateField()
    CitizenCountryCode = models.CharField(max_length = 2)

我的人员示例集合是通过mongoimport从CSV文件中导入的:

mongoimport --host localhost --db persons --collection personsExample --type csv --file reducedPersonsExtract.csv --headerline

由于出生日期设为字符串,我使用以下方法对其进行了转换:

db.personsExample.find().forEach(function(el){el.BirthDate = new ISODate(el.BirthDate); db.personsExample.save(el)})

我现在遇到的问题是它给出了BirthDate字段如下:

"BirthDate" : ISODate("1970-12-21T00:00:00Z")

但是在我的json查询中,date存储为

datetime.datetime(1970,12,21,0,0,0).isoformat()

给出了:

{
    "BirthDate": "1970-12-21T00:00:00"
}

因此,查询无效,我需要使用

进行查询
{
    "BirthDate": ISODate"1970-12-21T00:00:00Z"
}

(但我不能用Python创建这样的对象(ISODate)...) 或者找到另一种在MongoDB中存储日期的方法。

您是否碰巧知道如何解决我的问题?

1 个答案:

答案 0 :(得分:2)

我已经成功达到我想要的目标。实际上,我没有在DB中将日期转换为ISODate,我将它们存储为字符串“YYYY-MM-DD”。然后,我在我的API中格式化日期(将JSON查询发送到使用MongoDB的App):

my_dict['BirthDate'] =  datetime.datetime(YYYY,MM,DD).isoformat()

然后,在我的应用程序中:

json_resp = api_response.json() #Deserialization of the response

json_resp['BirthDate'] = datetime.datetime.strptime(json_resp['BirthDate'], "%Y-%m-%dT%H:%M:%S")

它可能不是最好的解决方案,但它确实有效。