質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
MongoDB

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

Python 3.x

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

Q&A

解決済

1回答

2975閲覧

pymongo にて、insert_one() を実行した際の成功失敗の判定

iBETA

総合スコア43

MongoDB

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

Python 3.x

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

0グッド

0クリップ

投稿2020/06/25 14:27

pymongo にて、insert_one() を実行した際、
成功したかどうかを知る為に、
皆様はどのように書かれていますでしょうか。。。
どなた様かどうかご教示いただけませんでしょうか。
どうぞよろしくお願いいたします。

成功すると、inserted_id には、_id の値が入ると思うのですが、

失敗した場合は、何も入らない!?(None)
もしくは、
inserted_id 自体が存在しなく、result には
オブジェクトが返って来るのではなく、None が帰ってくる!?
もし、前者なら、
以下のような感じでいいような気もするのですが、
いかがなものでしょうか。。。

Python

1result = collection.insert_one(document) 2 3if result.inserted_id: 4 status = True 5else: 6 status = False 7 8print(status)

補足情報

Python: 3.8, MongoDB: 4.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

pymongo の insert_one() を見たのですが、pymongo.results.InsertOneResult が返ってきます。None は返ってきません。

mongodb のドキュメントをみたら、 db.collection.insertOne() の戻り値が以下になっていました。

Returns: A document containing:

* A boolean acknowledged as true if the operation ran with write concern or false if write concern was disabled. * A field insertedId with the _id value of the inserted document.

acknowledged かな? 書き込みに問題があったら False になるみたい。

mongodb のドキュメントの内容が、 pymongo のソースコードに書いてあるので、インタラクティブシェルで、内容を確認してみてください。

python

1>>> from pymongo.results import InsertOneResult 2>>> help(InsertOneResult)

or

python

1>>> ... 2>>> result = collection.insert_one(document) 3>>> help(result)

投稿2020/07/08 03:52

編集2020/07/08 12:58
Bindi

総合スコア129

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

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

iBETA

2020/07/08 07:05

A boolean acknowledged as true if the operation ran with write concern or false if write concern was disabled. ということは。。。 僕のプログラミングで言うのなら、 if result.inserted_id: で比較するのではなく if result: に直した方が正解ということでしょうか。。。 どうぞよろしくお願いいたします。m(._.)m
Bindi

2020/07/08 14:09

いえ、ここでの result は InserOneResult というオブジェクトです。そして、必ず返ってきます。なので、その条件式では常に 真になります。 私なら insert_one() に pymongo.write_concern.WriteConcern が引数で渡せるので、それで判断するかな。もしくは、get_collection() に pymongo.write_concern.WriteConcern を渡して、そっちのオブジェクトで。(ソースコードをみたら、 get_collection() に渡した、WriteConcern は、 index_one() で渡した WriteConncern と同じなので、どっちにするかは書いた人次第。) なぜ、 WriteConncern で判断するかというと、 insertOneResult.acknowledged の値は、 WriteConcern があったら、pymongo.write_concern.WriteConcern.acknowledged の値を、 InsertOneResult.acknowledged にいれていて、無ければ insert_one の戻り値 acknowledged だけになるので、 WriteConncern がなくて False だったら、どうしようもなくなるから。 replication できるし、 index_one() って、そう単純ではなさそうですね。 説明するのも大変になってきた。これ見た人もよくわからないかもしれません。私もわからなくなってきた。 insert したときに取得できる _id って、すぐにそのあとで使うことはないとおもうので、_id で、insert の成功判断をしないのが、良いかもしれませんね。 mongodb をしっかり理解することが大事です。 pymongo って、 python で mongodb を操作できるドライバーですから、pymongo を理解しても mongodb は扱えない。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問