python3のWebクローラ戦闘-33、データストレージ:非リレーショナル・データベース・ストレージ:MongoDBの

NoSQLのは、だけでなく、SQLを意味するだけでなく、SQLの略で、非リレーショナルデータベースを参照。NoSQLの鍵ペアに基づいており、解析されたSQL層を必要とせず、非常に高い性能データとの間に結合が存在しません。

非リレーショナルデータベースと以下のように分けることができます。

  • その上のRedis、ヴォルデモート、OracleのBDBとを表すキーと値のストアデータベース、。
  • その上カサンドラ、HBaseの、Riakにとを表す、カラムストアデータベース、。
  • その上のCouchDB、MongoDBのとを表す文書データベース、。
  • そうでのNeo4j、InfoGrid、無限グラフとを表すグラフィックデータベース。

データ格納用のクローラが、データフィールドは、いくつかのケースを抽出するためのデータとの間の追加の入れ子関係が存在することができ、そこ削除の故障であってもよく、データはいつでも調整することができます。私たちは保存するために、リレーショナルデータベースを使用する場合、1は、事前にテーブルを構築する必要があり、そして第二に、データが入れ子になった場合の関係は、直列化の必要性がより不便に保存することができますが存在します。あなたは非リレーショナルデータベースを使用する場合、いくつかのトラブル、シンプルかつ効率的に回避することができます。

このセクションでは、MongoDBのとRedisのメインのデータストレージ事業を紹介します。

MongoDBのストレージ

MongoDBのは、C ++言語、非リレーショナルデータベースによって書かれた分散ファイル・ストレージに基づくオープンソースのデータベースシステムであり、同様のJSONオブジェクトの形式で格納されたコンテンツは、そのフィールドの値が他の文書、アレイおよびドキュメントの配列を含むことができ、非常に柔軟であり、であり、このセクションでは、我々はのpython3のMongoDBストレージ操作を見てください。

1.準備

インストール手順をインストールしていない場合は、このセクションを始める前に、MongoDBのをインストールし、そのサービスを開始していることを確認し、加えて、PythonのPyMongoライブラリをインストールし、最初の章です。

2.接続MongoDBの

デフォルトのポートは27017で合格していない場合、我々はMongoClient内のMongoDB接続PyMongoライブラリを使用する必要があり、最初の引数アドレスホストへの着信一般にMongoDBのIPとポート、2つ目のパラメータは、ポートポートです。

import pymongo
client = pymongo.MongoClient(host='localhost', port=27017)

我々はMongoDBのの接続オブジェクトを作成できるように。

さらにMongoClient最初のパラメータが直接送信されても​​よいMongoDBのホスト接続文字列は、例えば、MongoDBの始まります。

client = MongoClient('mongodb://localhost:27017/')

あなたは同じ効果接続を実現することができます。

3.データベースを指定します。

MongoDBのは、データベースに分割されており、私たちの次のステップはそうするデータベースを指定することで、ここで私は、一例として、データベースをテストするためだので、次のステップは、我々はプログラムで使用するデータベースを指定する必要があります。

db = client.test

もちろん、あなたがこれを指定することができ、テスト・テスト・データベースのプロパティを返すために、クライアントを呼び出します。

db = client['test']

二つの方法は同等です。

4.コレクションを指定します

各MongoDBのデータベースもコレクションコレクションの数が含まれている、それは我々が操作するコレクションを指定する必要が次のステップは、ここで私たちは、学生のコレクションの名前を指定し、学生のコレクション、また、データベースを指定して、リレーショナルデータベースのテーブルに似ています同様に、コレクションを指定するには、2つの方法があります。

collection = db.students

collection = db['students']

私たちは、Collectionオブジェクトを宣言します。

5.挿入したデータ

その後、我々はデータを挿入することができるようになりますが、このコレクションの学生のために、我々は新しい生徒データを構築し、辞書の形で表現:

student = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

次のようにここでは、その後、直接呼び出しの次のコレクションは、データを挿入する()メソッドを挿入し、生徒の学校番号、名前、年齢や性別を指定して、コードは次のとおりです。

result = collection.insert(student)
print(result)

MongoDBのでは、各データが実際に一意に_id属性を識別するために持って、明示的に_idを指定しない場合は、自動的にMongoDBのObjectId _id属性の種類を生成します。()_id方法を挿入し、実行後の値を返します。

結果:

5932a68615c2606814c91f3d

もちろん、我々は同時に複数のデータを挿入することができ、例えば、リスト内でのみ送信することができます。

student1 = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}

student2 = {
    'id': '20170202',
    'name': 'Mike',
    'age': 21,
    'gender': 'male'
}

result = collection.insert([student1, student2])
print(result)

結果の_idに対応して設定されて返される結果:

[ObjectId('5932a80115c2606a59e8a048'), ObjectId('5932a80115c2606a59e8a049')]

実際PyMongo 3.xバージョンでは、()メソッドの職員が推奨されていない、もちろん、何の問題を使用しないように引き続き挿入し、関係者は別個の単一および複数のレコードを挿入するためにinsert_one()とinsert_many()メソッドをお勧めします。

student = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}

result = collection.insert_one(student)
print(result)
print(result.inserted_id)

結果:

<pymongo.results.InsertOneResult object at 0x10d68b558>
5932ab0f15c2606f0c1cf6c5

戻り値、およびINSERT()メソッドが異なる、戻りInsertOneResultオブジェクト、我々はそのinserted_id不動産取得_idを呼び出すことができます。

insert_many()メソッドのために、我々は、例えば、表形式でデータを渡すことができます。

student1 = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}

student2 = {
    'id': '20170202',
    'name': 'Mike',
    'age': 21,
    'gender': 'male'
}

result = collection.insert_many([student1, student2])
print(result)
print(result.inserted_ids)

insert_many()メソッドは、型InsertManyResultを返し、挿入されたデータのリストを取得するinserted_ids _idプロパティを呼び出し、結果:

<pymongo.results.InsertManyResult object at 0x101dea558>
[ObjectId('5932abf415c2607083d3b2ac'), ObjectId('5932abf415c2607083d3b2ad')]

6.クエリ

私たちは、その後、生成されたオブジェクトを返す)(見つける、単一のクエリ結果を取得するために挿入find_one()メソッドまたはfind()メソッドクエリ、find_one()の後にデータを使用することができます。

result = collection.find_one({'name': 'Mike'})
print(type(result))
print(result)

ここでは、名前を照会することが、結果は辞書の種類、営業成績で返し、マイクのデータです。

<class 'dict'>
{'_id': ObjectId('5932a80115c2606a59e8a049'), 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male'}

これは、挿入プロセス中にMongoDBを自動的に追加された_id属性、より多くを見つけることができます。

また、必要性がのObjectId内BSONライブラリを使用するのObjectIdクエリから直接来ることができます。

from bson.objectid import ObjectId

result = collection.find_one({'_id': ObjectId('593278c115c2602667ec6bae')})
print(result)

その結果はまだ辞書の種類、オペレーティング結果です:

{'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}

ある場合はもちろん、何のクエリ結果はNoneを返されません。

次のようにデータの問い合わせ個の場合は、我々はそのような20個のデータの年齢の入手先として、find()メソッドを使用することができ、その例は以下のとおりです。

results = collection.find({'age': 20})
print(results)
for result in results:
    print(result)

結果:

<pymongo.cursor.Cursor object at 0x1032d5128>
{'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('593278c815c2602678bb2b8d'), 'id': '20170102', 'name': 'Kevin', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('593278d815c260269d7645a8'), 'id': '20170103', 'name': 'Harden', 'age': 20, 'gender': 'male'}
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

結果は、カーソルの種類、発電機の等価であり、我々はすべての結果を得るために横断する必要がある、それぞれの結果は、辞書の種類です。

あなたは20歳以上のデータを照会したい場合は、次のように書かれています:

results = collection.find({'age': {'$gt': 20}})

ここで条件キーは、単純に数値を問い合わせるのではなく、そのキーを使用すると、すべてのデータが20より古いチェックアウトすることができるように20個の以上のキーを意味し、比較のシンボル$ GTと呼ばれている辞書ではありません。

ここでは、比較記号を次の表にまとめます。

シンボル 意味
$のLT 以下 { '年齢' { '$のLT':20}}
$のGT より大きい { '年齢' { '$のGT':20}}
$のLTE 以下 { '年齢':{ '$のLTE':20}}
$ GTE 以上 { '年齢':{ '$ GTE':20}}
$ません 等しくありません {'age': {'$ne': 20}}
$で 範囲内 { '年齢' { 'で$':[20、23]}}
$ sを しない範囲内 { '年齢' { '$ニン':[20、23]}}

また、次のような例は、そのようなMで始まる生徒データとして、通常の試合クエリ、クエリ名にすることができます。

results = collection.find({'name': {'$regex': '^M.*'}})

本明細書で使用する場合、$の正規表現は、通常の試合を一致させるためには、定期的に沿ってすべての結果を確認することができますので、^ M. * Mは、正規表現で開始を表します。

ここでは、その後、次のように分類関数記号のいくつか:

シンボル 意味 例意味
$の正規表現 通常のマッチ { '名前':{ '$の正規表現': '^ M. *'}} Mで始まる名前
$が存在します プロパティが存在します { '名前':{ '$が存在する':真}} name属性が存在します
$タイプ 種別判定 { '年齢':{ '$タイプ': 'int型'}} 年齢はint型であります
$ MOD デジタルモード動作 { '年齢' { '$ MOD':[5,0]}} 年齢以上の05ダイ
$テキスト テキストクエリ { '$テキスト':{ '$検索': 'マイク'}} テキストtype属性は文字列マイクが含まれています
$場所 高度なクエリ条件 { '$ここで、': 'obj.fans_count == obj.follows_count'} ファンの注目の数に等しい彼らの数

MongoDBの中にこれらのより詳細な使用方法の操作は、公式ドキュメントで見つけることができます: https://docs.mongodb.com/manu ....

7.カウント

:データのクエリ結果の数をカウントするために、あなたは、このようなすべてのピースの統計データとしてのカウント()メソッドを呼び出すことができます

count = collection.find().count()
print(count)

一定の基準を満たしているかの統計データ:

count = collection.find({'age': 20}).count()
print(count)

結果はデー​​タ数が条件を満たしている、すなわち数値です。

8.ソート

あなたは、たとえば、ソートフィールドの降順に渡し、署名する昇順、ソート()メソッドを呼び出すことができます。

results = collection.find().sort('name', pymongo.ASCENDING)
print([result['name'] for result in results])

結果:

['Harden', 'Jordan', 'Kevin', 'Mark', 'Mike']

ここでは、pymongo.ASCENDINGはあなたがpymongo.DESCENDINGを渡すことができれば、降順、昇順を指定して呼び出します。

9.オフセット

スキップ()メソッドは、2オフセット、それは前者の2つの要素を無視し、後三要素を得るために、いくつかの場所を、シフトここで我々はほんの数の要素を利用したいかもしれないいくつかのケースでは、利用されてもよいです。

results = collection.find().sort('name', pymongo.ASCENDING).skip(2)
print([result['name'] for result in results])

結果:

['Kevin', 'Mark', 'Mike']

次のようにも()限界と結果の指定された数を取る方法、例であります:

results = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(2)
print([result['name'] for result in results])

結果:

['Kevin', 'Mark']

制限しない場合は()、元の3つの結果を返します、と2つの結果の傍受後の制限が返されます。

このような千万、億のレベルとして当時のデータベースの非常に多く、で、それがデータを照会するために大きなオフセットを使用するのが最善ではありません、ということに注目すべきである、メモリリークが発生する可能性がある、あなたは、次の操作のようなクエリを使用することができます。

from bson.objectid import ObjectId
collection.find({'_id': {'$gt': ObjectId('593278c815c2602678bb2b8d')}})

良い記録_idこの時、最後の問い合わせ。

10.アップデート

データ更新update()メソッドのために使用することができる、指定されたデータは、例えば、条件を更新し、更新することができます。

condition = {'name': 'Kevin'}
student = collection.find_one(condition)
student['age'] = 25
result = collection.update(condition, student)
print(result)
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

ここでは、最初のクエリを指定し、データはケビンの年齢のように更新された後、クエリデータを名前、年齢を変更し、更新を呼び出す()メソッドとデータを完了するために、渡された元のデータ変更の条件の後になりますアップデート。

結果:

{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}

結果は正常に実行さ、罹患nModifiedの数を表すデータを表す辞書、OKです。

さらに以下のように、我々はまた、データを更新するために$集合演算子を使用することができ、コードを読みます:

result = collection.update(condition, {'$set': student})

その元に更新されていない他のフィールドがある場合、この更新辞書メモリの分野で唯一の学生は、削除されません。そして、されていない場合、元の他のフィールドがある場合、それは、また辞書と全体の生徒の前にデータの$のセットを置く削除されます。

また、我々は、この方法が実際に正式方法、ここにも分けupdate_one()メソッドとupdate_many()メソッドを推奨されていません)、より厳格な第二引数の使用は、辞書名の$タイプ演算子キーを使用する必要があります(更新します手触りの例と。

condition = {'name': 'Kevin'}
student = collection.find_one(condition)
student['age'] = 26
result = collection.update_one(condition, {'$set': student})
print(result)
print(result.matched_count, result.modified_count)

ここでupdate_oneコール()メソッドは、第2のパラメータ辞書は、直接渡さ改変が、{「$セット」:学生}使用する必要があることはできないmatched_countを呼び出し、結果はタイプUpdateResultなるよう形を、そしてデータ番号と、影響を受けるデータ・ストライプの数は、利用可能なmodified_countマッチング特性です。

結果:

<pymongo.results.UpdateResult object at 0x10d17b678>
1 0

私たちは例を見て:

condition = {'age': {'$gt': 20}}
result = collection.update_one(condition, {'$inc': {'age': 1}})
print(result)
print(result.matched_count, result.modified_count)

ここでは、クエリ条件は20歳以上で指定して、[更新条件は、{「$のincは」:{「年齢」:1}}で、年齢の増加であるが、それが実行するデータプラス1つの年齢後の最初の条件を満たしています。

結果:

<pymongo.results.UpdateResult object at 0x10b8874c8>
1 1

また、影響力の数としてマッチの数を見ることができます。

あなたはupdate_many()メソッドを呼び出した場合は、すべての修飾されたデータは、例えば、更新されています。

condition = {'age': {'$gt': 20}}
result = collection.update_many(condition, {'$inc': {'age': 1}})
print(result)
print(result.matched_count, result.modified_count)

一致の数の点で、この時点では、次のような結果であるが、もはや1ではありません。

<pymongo.results.UpdateResult object at 0x10c6384c8>
3 3

そして、あなたはすべての一致するデータが更新されます見ることができます。

11.削除

操作は比較的簡単です削除し、すべてのデータの条件を満たすように指定した条件を削除するには、ダイレクトコールremove()メソッドは、たとえば、削除されます。

result = collection.remove({'name': 'Kevin'})
print(result)

結果:

{'ok': 1, 'n': 1}

さらに、まだ二つの新しい推薦方法、メソッドdelete_one()とdelete_many()、次の例:

result = collection.delete_one({'name': 'Kevin'})
print(result)
print(result.deleted_count)
result = collection.delete_many({'age': {'$lt': 25}})
print(result.deleted_count)

結果:

<pymongo.results.DeleteResult object at 0x10e6ba4c8>
1
4
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

delete_one()()すべての適格のデータを削除され、結果はDeleteResultタイプである第一、delete_manyの条件に沿ったものであるデータを削除し、あなたが呼び出すことができますdeleted_countプロパティは、削除するデータの個数を取得します。

12.もっと

さらにPyMongoはまた、find_one_and_deleteような方法の組み合わせを提供する()、find_one_and_replace()、find_one_and_update()、つまり、削除を発見した後に、交換され、上述の方法を用いて、更新操作は、基本的に同じです。

また、create_index()、create_indexes()、drop_index()など、インデックスを操作することができます。

13.おわりに

このセクションでは、我々は、後でデータ・ストレージ・ケースのため、実際の戦闘活動でそれらを使用します、検索方法を変更するPyMongo操作MongoDBのデータの追加および削除について説明します。

おすすめ

転載: blog.51cto.com/14445003/2426850
おすすめ