datetime.datenot part of bson coding codes. (Perhaps the authors forgot about this or left it intentionally, since it is ambiguous to add time information to date exactly like that.)
But you can write a function to extend custom types in pymongo.
Just as you increase JSONEncoderin json, you can do something similar in pymongo using SONManipulator:
import datetime
import pymongo
class MigrationTransformer(pymongo.son_manipulator.SONManipulator):
def _encode_date(self, value):
return datetime.datetime.combine(
value,
datetime.datetime.min.time())
def transform_incoming(self, son, collection):
for (key, value) in son.items():
if type(value) == datetime.date:
son[key] = self._encode_date(value)
elif isinstance(value, dict):
son[key] = self.transform_incoming(value, collection)
return son
DB:
db.add_son_manipulator(MigrationTransformer())
( transform_outgoing, , : http://api.mongodb.org/python/current/examples/custom_type.html)
. , dict . - pymongo SONManipulator. , .
, ( sets tuples).
class MigrationTransformer(SONManipulator):
def _encode_date(self, value):
return datetime.datetime.combine(
value,
datetime.datetime.min.time())
def _handle_list(self, value):
for index, item in enumerate(value):
if isinstance(item, dict):
value[index] = self._handle_dict(item)
elif isinstance(item, list):
value[index] = self._handle_list(item)
elif isinstance(item, datetime.date):
value[index] = self._encode_date(item)
return value
def _handle_dict(self, item):
for (key, value) in item.items():
if type(value) == datetime.date:
item[key] = self._encode_date(value)
elif isinstance(value, dict):
item[key] = self._handle_dict(value)
elif isinstance(value, list):
item[key] = self._handle_list(value)
return item
def transform_incoming(self, son, collection):
for (key, value) in son.items():
if type(value) == datetime.date:
son[key] = self._encode_date(value)
elif isinstance(value, dict):
son[key] = self.transform_incoming(value, collection)
elif isinstance(value, list):
son[key] = self._handle_list(value)
return son