python-bson.Fehler.InvalidDocument: Nicht codieren Objekt: datetime.Datum(Jahr 2015, 3, 1)
Habe ich die folgenden Funktionen:
# this is in a module called 'dbw_lib'
def dateTimeOuput(start_days_back, end_days_back):
start_delta = datetime.timedelta(days=start_days_back)
end_delta = datetime.timedelta(days=end_days_back)
start_date = datetime.date.today() - start_delta
end_date = datetime.date.today() - end_delta
return start_date, end_date
def dictByDate(start_days, end_days):
start_date, end_date = dbw_lib.dateTimeOuput(start_days, end_days)
date_string = { "created_at": {"$gte" : start_date, "$lt": end_date } }
user_id_email_dict = dbw_lib.dbwIdToEmailD(user_coll_obj, date_query = date_string) # dict of all user ids and emails
print user_id_email_dict
quit()
wenn ich key_dicts = dictByDate(90, 60)
erhalte ich folgenden traceback:
Traceback (most recent call last):
File "main.py", line 212, in <module>
program.runProgram()
File "main.py", line 61, in runProgram
report.RcreateReport()
File "filepath/report.py", line 86, in RcreateReport
key_dicts = dictByDate(90, 60)
File "filepath/report.py", line 65, in dictByDate
user_id_email_dict = dbw_lib.dbwIdToEmailD(user_coll_obj, date_query = date_string) # dict of all user ids and emails
File "filepath/dbw_lib.py", line 50, in dbwIdToEmailD
for pair in id_email_cursor:
File "/Library/Python/2.7/site-packages/pymongo-3.0-py2.7-macosx-10.9-intel.egg/pymongo/cursor.py", line 968, in __next__
File "/Library/Python/2.7/site-packages/pymongo-3.0-py2.7-macosx-10.9-intel.egg/pymongo/cursor.py", line 905, in _refresh
File "/Library/Python/2.7/site-packages/pymongo-3.0-py2.7-macosx-10.9-intel.egg/pymongo/cursor.py", line 812, in __send_message
File "/Library/Python/2.7/site-packages/pymongo-3.0-py2.7-macosx-10.9-intel.egg/pymongo/mongo_client.py", line 732, in _send_message_with_response
File "/Library/Python/2.7/site-packages/pymongo-3.0-py2.7-macosx-10.9-intel.egg/pymongo/mongo_client.py", line 743, in _reset_on_error
File "/Library/Python/2.7/site-packages/pymongo-3.0-py2.7-macosx-10.9-intel.egg/pymongo/server.py", line 85, in send_message_with_response
File "/Library/Python/2.7/site-packages/pymongo-3.0-py2.7-macosx-10.9-intel.egg/pymongo/message.py", line 107, in get_message
bson.errors.InvalidDocument: Cannot encode object: datetime.date(2015, 3, 1)
Du musst angemeldet sein, um einen Kommentar abzugeben.
ersetzen Sie einfach
mit
Stellt sich heraus, dass
Zitat Quelle.
Diese Antwort Staaten, die dies getan werden kann, mit der
datetime.datetime.combine
Methode etwa so:datetime.date
ist nicht Teil des bson-Encoder. (Vielleicht haben die Autoren vergessen oder ließ es sich absichtlich seit seiner zweideutigen anfügen Zeit, die Informationen zu Datum, einfach so.)Aber man könnte eine Funktion schreiben, erweitern, benutzerdefinierte Typen, die in pymongo
Genauso, wie Sie erweitern eine
JSONEncoder
imjson
Sie konnte etwas tun, ähnlich wie in pymongo mit einemSONManipulator
:und dann fügen Sie es zu Ihrer DB-instance:
(Ich habe nicht die
transform_outgoing
Methode, da, die nicht relevant für die Frage, aber du könntest es hier finden: http://api.mongodb.org/python/current/examples/custom_type.html)Bearbeiten: Es ist ein problem, wenn der Wert des Schlüssel im dict ist eine Liste geben. Für einige Grund, pymongo nicht übergeben es an die
SONManipulator
. Also die Liste ist nicht transformiert.Habe ich aktualisiert, die Klasse zu handhaben, als auch (aber ich habe es nicht für
sets
undtuples
).add_son_manipulator()
Methode ist veraltet. PyMongo 3 neue CRUD API gilt nicht, SOHN Manipulatoren