Pythonでmongodbを操作する～その５：delete編～

#当記事の記載範囲
この記事ではPythonでmongodbに接続してから、delete（SQLで言ってもdelete）の使い方について記載します。
内容としては以下になります。

1. delete_one
2. delete_many

mongodbの起動やpymongoのインストール方法については以下の記事をご覧いただければ幸いです。
https://qiita.com/bc_yuuuuuki/items/2b92598434f6cc320112

#準備データ
mongodbの準備データは以下のとおりです。

```
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
> show collections
employee
log
salary
> db.salary.find()
{ "_id" : ObjectId("5d4acf84de925ae437e2c124"), "name" : "佐藤", "salary" : 400000 }
{ "_id" : ObjectId("5d4acf84de925ae437e2c125"), "name" : "田中", "salary" : 500000 }
{ "_id" : ObjectId("5d4f814c950945628d663d95"), "name" : "加藤", "salary" : 400000 }
{ "_id" : ObjectId("5d4f814c950945628d663d96"), "name" : "松井", "salary" : 500000 }
{ "_id" : ObjectId("5d4fa35cb9899c6bedb140a1"), "name" : "山田", "salary" : 300000 }
{ "_id" : ObjectId("5d4fa852ee2d4a2cead2784b"), "name" : "山田", "salary" : 400000 }
```

#Pythonでdeleteを使ってみる
まずはdelete_oneから使ってみます。
##delete_oneの使い方
早速、サンプルのコードです。
内容はdelete前のデータ取得、delete_one、delete後のデータ取得を行っています。

``` MongoDeleteSample.py
from pymongo import MongoClient

class MongoDeleteSample(object):
    
    def __init__(self, dbName, collectionName):
        self.client = MongoClient()
        self.db = self.client[dbName]
        self.collection = self.db.get_collection(collectionName)

    def find(self, projection=None,filter=None, sort=None):
        return self.collection.find(projection=projection,filter=filter,sort=sort)

    def delete_one(self, filter):
        return self.collection.delete_one(filter)

    def delete_many(self, filter):
        return self.collection.delete_many(filter)

    def find_one_and_delete(self, filter):
        return self.collection.find_one_delete(filter)

mongo = MongoDeleteSample('test', 'salary')
print('--------------------削除前--------------------')
find = mongo.find()
for doc in find:
    print(doc)

print('-------------------削除情報-------------------')
result = mongo.delete_one({'name':'山田'})
print(type(result))
print(result)
print(result.deleted_count)

print('--------------------削除後--------------------')
find = mongo.find()
for doc in find:
    print(doc)
```
実行結果

```
--------------------削除前--------------------
{'_id': ObjectId('5d4acf84de925ae437e2c124'), 'name': '佐藤', 'salary': 400000.0}
{'_id': ObjectId('5d4acf84de925ae437e2c125'), 'name': '田中', 'salary': 500000.0}
{'_id': ObjectId('5d4f814c950945628d663d95'), 'name': '加藤', 'salary': 400000}
{'_id': ObjectId('5d4f814c950945628d663d96'), 'name': '松井', 'salary': 500000}
{'_id': ObjectId('5d4fa35cb9899c6bedb140a1'), 'name': '山田', 'salary': 300000}
{'_id': ObjectId('5d4fa852ee2d4a2cead2784b'), 'name': '山田', 'salary': 400000}
-------------------削除情報-------------------
<class 'pymongo.results.DeleteResult'>
<pymongo.results.DeleteResult object at 0x00000216FB2E6788>
1
--------------------削除後--------------------
{'_id': ObjectId('5d4acf84de925ae437e2c124'), 'name': '佐藤', 'salary': 400000.0}
{'_id': ObjectId('5d4acf84de925ae437e2c125'), 'name': '田中', 'salary': 500000.0}
{'_id': ObjectId('5d4f814c950945628d663d95'), 'name': '加藤', 'salary': 400000}
{'_id': ObjectId('5d4f814c950945628d663d96'), 'name': '松井', 'salary': 500000}
{'_id': ObjectId('5d4fa852ee2d4a2cead2784b'), 'name': '山田', 'salary': 400000}
```
'name'が'山田'のデータが１件しか削除されていないことが分かります。

##delete_manyの使い方
MongoDeleteSample.pyを変更する

``` （抜粋）MongoDeleteSample.py
mongo = MongoDeleteSample('test', 'salary')
print('--------------------削除前--------------------')
find = mongo.find()
for doc in find:
    print(doc)

print('-------------------削除情報-------------------')
result = mongo.delete_many({'name':'山田'})
print(type(result))
print(result)
print(result.deleted_count)

print('--------------------削除後--------------------')
find = mongo.find()
for doc in find:
    print(doc)
```
実行結果

```
--------------------削除前--------------------
{'_id': ObjectId('5d4acf84de925ae437e2c124'), 'name': '佐藤', 'salary': 400000.0}
{'_id': ObjectId('5d4acf84de925ae437e2c125'), 'name': '田中', 'salary': 500000.0}
{'_id': ObjectId('5d4f814c950945628d663d95'), 'name': '加藤', 'salary': 400000}
{'_id': ObjectId('5d4f814c950945628d663d96'), 'name': '松井', 'salary': 500000}
{'_id': ObjectId('5d4faefd0d162cddb4fa19d0'), 'name': '山田', 'salary': 300000}
{'_id': ObjectId('5d4faf056d857bceb9bd0c06'), 'name': '山田', 'salary': 400000}
-------------------削除情報-------------------
<class 'pymongo.results.DeleteResult'>
<pymongo.results.DeleteResult object at 0x000001722C7CBCC8>
2
--------------------削除後--------------------
{'_id': ObjectId('5d4acf84de925ae437e2c124'), 'name': '佐藤', 'salary': 400000.0}
{'_id': ObjectId('5d4acf84de925ae437e2c125'), 'name': '田中', 'salary': 500000.0}
{'_id': ObjectId('5d4f814c950945628d663d95'), 'name': '加藤', 'salary': 400000}
{'_id': ObjectId('5d4f814c950945628d663d96'), 'name': '松井', 'salary': 500000}
```
'name'が'山田'のデータが２件削除されていることが分かります。

#感想
Pythonからmongodbを操作する方法がこれでCRUDの一通りのやり方が分かりました。
mongodbのコマンドとパラメーターの設定内容がほとんど一緒で使いやすいなと感じました。

#関連記事
- [Pythonでmongodbを操作する～その１～](https://qiita.com/bc_yuuuuuki/items/2b92598434f6cc320112)
- [Pythonでmongodbを操作する～その２：find編～](https://qiita.com/bc_yuuuuuki/items/23fa7ba63399e64cf321)
- [Pythonでmongodbを操作する～その３：update編～](https://qiita.com/bc_yuuuuuki/items/f80e62784aa4f6ec5834)
- [Pythonでmongodbを操作する～その４：insert編～](https://qiita.com/bc_yuuuuuki/items/07aab6cd5615e79bdf58)