🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

6172閲覧

pythonにてmongoDBの日付時刻検索をするとエラーになり抽出できない

Otazoman

総合スコア44

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2019/11/19 06:30

編集2020/01/06 07:31

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

ものすごく凡ミスでした。大変失礼いたしました。findの後にfilterを追加できていませんでした。
確認が不十分でした。すいません。
こちらで時間で検索できるようになりました。

https://qiita.com/bc_yuuuuuki/items/23fa7ba63399e64cf321

python

1import datetime 2import json 3import pprint 4import re 5import sys 6import traceback 7import mongo_crud as mon 8 9def find_mongo(): 10 try: 11 tz = datetime.timezone.utc 12 td = datetime.timedelta(hours=-1) 13 start = datetime.datetime.now(tz) + td 14 end = datetime.datetime.now(tz) 15 16 print("FIND START") 17 mongo = mon.MongoFind('database', 'pass') 18 find = mongo.find(filter={'date_column':{'$gte': start,'$lt': end}}, 19 projection={'_id':0,}) 20 print('--------------------条件--------------------') 21 for doc in find: 22 print(doc) 23 except Exception as e: 24 t, v, tb = sys.exc_info() 25 print(traceback.format_exception(t,v,tb)) 26 print(traceback.format_tb(e.__traceback__)) 27 28def main(): 29 find_mongo() 30 31if __name__ == '__main__': 32 main()

投稿2020/01/06 08:23

Otazoman

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問