MongoLink入門
MongoLinkはMongoDBを使うためのツールである.このチュートリアルでは,MongoDBに対してよく行われる操作をMongoLinkを使ってどのように行うのかについて説明する.
このチュートリアルでは,MongoDBサーバがお使いのローカルマシン上で,デフォルトのホストとポートで動作中であることを想定している.MongoDBサーバをローカルで実行するためのプラットフォームごとの説明はこちらを参照されたい.
ローカル接続の確立
Needs["MongoLink`"]デフォルトのホスト"localhost"とポート27017(これらはローカルマシンでMongoDBサーバを起動するときのデフォルトのホスト名とポートである)を使ってクライアント接続を確立する:
client = MongoConnect[]client = MongoConnect[<|"Host" -> "localhost", "Port" -> 27017|>]またはMongoDB接続文字列URI形式も使える:
client = MongoConnect["mongodb://localhost:27017/"]データベースへの接続
MongoDBサーバは複数の独立したデータベースをホストすることができる.サーバで利用できるデータベースをリストする:
MongoGetDatabaseNames[client]db = client["WolframTestDB"]db = MongoGetDatabase[client, "WolframTestDB"]コレクションへの接続
コレクションはドキュメントの集合である.コレクションを取得することは,データベースを取得することと同じである:
coll = db["WolframTest"]coll = MongoGetCollection[db, "WolframTest"]注意:データベースとコレクションは遅延で作成されるので,コレクションとデータベースの取得はMongoDBサーバに対して何の操作も行わない.コレクションとデータベースは最初のドキュメントがそれらに挿入されたら初めて作られる.
ドキュメント
MongoDBにおけるドキュメントは,(場合によっては)ネストしたAssociationとして見ることができる.ここで,キーは文字列でなければならず,値は少数のタイプ(文字列,リスト,整数,日付等)に限られる.ドキュメントの簡単な例を以下に挙げる:
cat1 = <|"age" -> 3, "sex" -> "female", "date" -> DateObject[]|>値として使用できるタイプのリストは,"BSON"形式のドキュメントを参照されたい.
1つのドキュメントをコレクションに挿入する
前出のドキュメントを"WolframTest"コレクションに挿入する:
inserted = MongoCollectionInsert[coll, cat1]ids = inserted["InsertedIDs"]注意Note: :MongoDBのどのドキュメントも"_id"キーを持たなければならない.挿入するドキュメントがこのキーを持たない場合,キーは自動的にドキュメントに加えられ,値はタイプBSONObjectIDとなる.
BSONObjectIDオブジェクトはその作成に関するさまざまなメタ情報を含む:
Normal[First@ids]複数のドキュメントをコレクションに挿入する
多くのドキュメントを一度にコレクションに挿入するとより効率的である.ドキュメントのリストを作成する:
catsData = {<|"age" -> 5, "sex" -> "male", "date" -> DateObject[]|>,
<|"age" -> 4, "sex" -> "female", "date" -> DateObject[]|>}MongoCollectionInsert[coll,catsData]ドキュメントを1つ取得する
MongoCollectionFindOneを使って簡単なクエリを実行すると,コレクションの中からドキュメントが1つ返される:
MongoCollectionFindOne[coll]MongoCollectionFindOne[coll, <|"age" -> 5|>]プロジェクションを使うと,さまざまな不要キーを除くことができる."date"と"sex"のフィールドを除く:
MongoCollectionFindOne[coll, <|"age" -> 5|>, <|"date" -> False, "sex" -> False|>]ドキュメントの不要部分を転送する必要がなくなるため,これはサーバからのドキュメントの転送速度を高めるために使用できる.
注意:クエリの作成方法については,MongoDBのドキュメントのチュートリアル「Query Documents」が参考になる.
複数のドキュメントを取得する
MongoCollectionFindのシンタックスはMongoCollectionFindOneのものと同じであるが,ドキュメントの代りに,大規模データ集合の操作に適したMongoCursorが返される:
curs = MongoCollectionFind[coll]MongoCursorに対してRead(またはMongoCursorNextでも同じ)を呼び出すと,次のドキュメントが得られる:
Read[curs]Read[curs]Read[curs]カーソルからすべてのドキュメントが読み込まれた後に再びReadを呼び出すと,Nullが返される:
Read[curs]再びドキュメントを読み込むためには,新しいカーソルを作成する必要がある:
curs = MongoCollectionFind[coll]ReadList (またはMongoCursorToArrayでも同じ)を呼び出すと,残りのすべてのドキュメントのリストが得られる:
docs = ReadList[curs]カーソル内の全てのドキュメントはDatasetに読み込むこともできる:
curs = MongoCollectionFind[coll];
Dataset[curs]カーソルの本当の有用性は,コレクション内の全てのドキュメントをメモリ内にロードしておかなくても処理することができることにある:
curs = MongoCollectionFind[coll];
While[AssociationQ[data = Read[curs]], Print@data["_id"]];コレクションからのサンプリング
sample = RandomSample[coll, 2]カーソルをDatasetに読み込む:
Dataset[sample]ドキュメントの変更
"age"が4より大きいすべてのドキュメントを,"age"が10となるように変更する:
MongoCollectionUpdateMany[coll, <|"age" -> <|"$gt" -> 4|>|>, <|"$set" -> <|"age" -> 10|>|>]curs = MongoCollectionFind[coll];
Dataset[curs]ドキュメントの削除
注意:ドキュメントの削除は危険で,簡単には取消し操作ができない.コレクション内で"age"が3であるドキュメントをすべて削除する:
MongoCollectionDeleteMany[coll, <|"age" -> 3|>]MongoCollectionDeleteMany[coll, <||>]