前提・実現したいこと
PythonでmongoDBに格納されたデータについて日付時刻で抽出しようとしております。
色々と調べながら検索する処理を書いたのですが、どうしてもエラーが出て検索できません。
どうすれば日付時刻で検索できるでしょうか。
発生している問題・エラーメッセージ
日付の検索箇所でエラーになっています。
['Traceback (most recent call last):\n', ' File "mongo_operate.py", line 72, in find_mongo\n for doc in find:\n', ' File "/home/user/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pymongo/cursor.py", line 1156, in next\n if len(self.__data) or self._refresh():\n', ' File "/home/user/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pymongo/cursor.py", line 1073, in _refresh\n self.__send_message(q)\n', ' File "/home/user/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pymongo/cursor.py", line 955, in __send_message\n address=self.__address)\n', ' File "/home/user/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1347, in _run_operation_with_response\n exhaust=exhaust)\n', ' File "/home/user/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1465, in _retryable_read\n return func(session, server, sock_info, slave_ok)\n', ' File "/home/user/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1341, in _cmd\n unpack_res)\n', ' File "/home/user/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pymongo/server.py", line 136, in run_operation_with_response\n _check_command_response(first)\n', ' File "/home/user/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pymongo/helpers.py", line 159, in _check_command_response\n raise OperationFailure(msg % errmsg, code, response)\n', 'pymongo.errors.OperationFailure: >1 field in obj: { $gte: new Date(1573430400000), $lt: new Date(1574042400000) }\n'] [' File "mongo_operate.py", line 72, in find_mongo\n for doc in find:\n', ' File "/home/user/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pymongo/cursor.py", line 1156, in next\n if len(self.__data) or self._refresh():\n', ' File "/home/user/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pymongo/cursor.py", line 1073, in _refresh\n self.__send_message(q)\n', ' File "/home/user/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pymongo/cursor.py", line 955, in __send_message\n address=self.__address)\n', ' File "/home/user/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1347, in _run_operation_with_response\n exhaust=exhaust)\n', ' File "/home/user/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1465, in _retryable_read\n return func(session, server, sock_info, slave_ok)\n', ' File "/home/user/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1341, in _cmd\n unpack_res)\n', ' File "/home/user/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pymongo/server.py", line 136, in run_operation_with_response\n _check_command_response(first)\n', ' File "/home/user/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pymongo/helpers.py", line 159, in _check_command_response\n raise OperationFailure(msg % errmsg, code, response)\n']
該当のソースコード
mongo_crudはこちらを参考に作成したものをimportしております。
import datetime import json import pprint import re import sys import traceback import mongo_crud as mon def find_mongo(): try: tz = datetime.timezone.utc td = datetime.timedelta(hours=-1) start = datetime.datetime(2019, 11, 11, 0, tzinfo=tz) end = datetime.datetime(2019, 11, 18, 2, tzinfo=tz) print("FIND START") mongo = mon.MongoFind('database', 'pass') find = mongo.find({'_id':0}) find = mongo.find({'date_column':{'$lt':start}},{'_id':0}) find = mongo.find({'date_column':{'$gte': start,'$lt': end}},{'_id':0}) #find = mongo.find({'date_column':{'$lt':start.isoformat()}},{'_id':0}) print('--------------------条件--------------------') for doc in find: print(doc) except Exception as e: t, v, tb = sys.exc_info() print(traceback.format_exception(t,v,tb)) print(traceback.format_tb(e.__traceback__)) def main(): find_mongo() if __name__ == '__main__': main()
使用しているデータ
以下の通りです。
{ "_id" : ObjectId("5dc907e7a0e1c68c304282c1"), "new_column1" : "new_value1", "new_column2" : "A9991", "date_column" : ISODate("2019-11-11T07:04:07.005Z") } { "_id" : ObjectId("5dc907f6a0e1c68c304282c3"), "new_column1" : "new_value3", "new_column2" : "A9993", "date_column" : ISODate("2019-11-11T07:04:22.157Z") } { "_id" : ObjectId("5dc907fda0e1c68c304282c4"), "new_column1" : "new_value4", "new_column2" : "A9994", "date_column" : ISODate("2019-11-11T07:04:29.276Z") } { "_id" : ObjectId("5dc90805a0e1c68c304282c5"), "new_column1" : "new_value5", "new_column2" : "B9991", "date_column" : ISODate("2019-11-11T07:04:37.501Z") } { "_id" : ObjectId("5dc90812a0e1c68c304282c7"), "new_column1" : "new_value7", "new_column2" : "B9993", "date_column" : ISODate("2019-11-11T07:04:50.301Z") } { "_id" : ObjectId("5dc90818a0e1c68c304282c8"), "new_column1" : "new_value8", "new_column2" : "B9994", "date_column" : ISODate("2019-11-11T07:04:56.830Z") } { "_id" : ObjectId("5dca20609a78d881044f30a8"), "new_column1" : "new_value9", "new_column2" : "B9995", "date_column" : ISODate("2019-11-12T03:00:48.348Z") }
試したこと
・pythonのプログラム上からは条件を指定しないfindでは問題なくデータ抽出できます。
・日付時刻型以外の項目に条件を指定した場合でもデータを抽出することができました。
・日付については以下の通り書いてみてもエラーとなり結果を抽出できませんでした。
find = mongo.find({'date_column':{'$lt':start.isoformat()}},{'_id':0})
mongodbのコンソール上で以下の様にコマンドを叩くとデータは抽出できました。
db.test1.find({date_column:{$gte:ISODate("2019-11-11T07:01:00Z"),$lte:ISODate("2019-11-11T07:57:00Z")}},{_id:0})
startとendの出力結果でいずれもdatetime.datetimeとして認識はされているようです。
<class 'datetime.datetime'> 2019-11-11 00:00:00+00:00 <class 'datetime.datetime'> 2019-11-18 02:00:00+00:00
補足情報(FW/ツールのバージョンなど)
python 3.7.5
mongoDB 4.0.13
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。