Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What is going on with this article?
@FukuharaYohei

MongoDBのUbuntuへのインストールとシェルとPythonで動作確認

More than 1 year has passed since last update.

MongoDBをUbuntuにインストールしてシェルとPython(PyMongoパッケージ)で簡単な動作確認をしました。インストール方法は「Install MongoDB Community Edition on Ubuntu」を、「Getting Started」を参照しています。

環境

種類 バージョン 内容
OS Ubuntu18.04.01 LTS 仮想で動かしています
MongoDB 4.2.0 2019年9月に最新
Python 3.6.8 Pyenvで動かしています

手順

1. インストール

.debパッケージを使ってインストールします。

1.1. MongoDBの公開鍵インポート

ターミナルからMongoDBの公開鍵をインポート。

wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -

1.2. MongoDBのリストファイル作成

echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list

1.3. パッケージDBの再読込

sudo apt-get update

1.4. MongoDBインストール

sudo apt-get install -y mongodb-org

2. MongoDB起動

2.1. MongoDB起動

mongodを起動

sudo service mongod start

2.2. ログファイルから起動確認

sudo cat /var/log/mongodb/mongod.log

ログファイルを見て、起動できているかを確認します。起動できている場合はデフォルトポート27017でリクエストを待っている旨が最後に出力されます。

2019-09-09T17:09:45.872+0900 I NETWORK  [initandlisten] waiting for connections on port 27017

3. Mongo Shellで簡単に試す

mongodを起動した状態でmongo shellを試します。

3.1. Local MongoDBにデフォルトPortで接続

デフォルトポート27017でLocalのMongoDBに接続します。

mongo

DBの表示をします。testはデフォルトデータベースの名前です。

$ db
test

DB変更。今回は未登録のDBmyNewDatabaseを指定し、DB登録と変更を同時を行う。

$ use myNewDatabase
switched to db myNewDatabase

myNewDatabaseのテーブルmyCollenctionに対してインサート。

$ db.myCollection.insertOne( { x: 1 } );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cb9166e0424b2e17c7ce5eb")
}

テーブルから値を取得するクエリ実行。

$ db.myCollection.find().pretty()
{ "_id" : ObjectId("5cb9166e0424b2e17c7ce5eb"), "x" : 1 }

4. mongo Shellを少し深く試す

もう少しだけmongo Shellを深く試します。
inventoryというDBを登録します。

$ use inventory
switched to db inventory

4.1. Insert

複数行を一括でInsert。

$ db.inventory.insertMany([
   // MongoDB adds the _id field with an ObjectId if _id is not present
   { item: "journal", qty: 25, status: "A",
       size: { h: 14, w: 21, uom: "cm" }, tags: [ "blank", "red" ] },
   { item: "notebook", qty: 50, status: "A",
       size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank" ] },
   { item: "paper", qty: 100, status: "D",
       size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank", "plain" ] },
   { item: "planner", qty: 75, status: "D",
       size: { h: 22.85, w: 30, uom: "cm" }, tags: [ "blank", "red" ] },
   { item: "postcard", qty: 45, status: "A",
       size: { h: 10, w: 15.25, uom: "cm" }, tags: [ "blue" ] }
]);

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("5cb9184d0424b2e17c7ce5ec"),
        ObjectId("5cb9184d0424b2e17c7ce5ed"),
        ObjectId("5cb9184d0424b2e17c7ce5ee"),
        ObjectId("5cb9184d0424b2e17c7ce5ef"),
        ObjectId("5cb9184d0424b2e17c7ce5f0")
    ]
}

4.2. クエリ

クエリ系。

4.2.1. 全取得

検索条件なしで全取得。

$ db.inventory.find( {} )

{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ec"), "item" : "journal", "qty" : 25, "status" : "A", "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "tags" : [ "blank", "red" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ed"), "item" : "notebook", "qty" : 50, "status" : "A", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "tags" : [ "red", "blank" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ee"), "item" : "paper", "qty" : 100, "status" : "D", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "tags" : [ "red", "blank", "plain" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ef"), "item" : "planner", "qty" : 75, "status" : "D", "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "tags" : [ "blank", "red" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5f0"), "item" : "postcard", "qty" : 45, "status" : "A", "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "tags" : [ "blue" ] }

4.2.2. 条件つきで検索

検索条件ありで検索。

$ db.inventory.find( { status: "D" } )

{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ee"), "item" : "paper", "qty" : 100, "status" : "D", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "tags" : [ "red", "blank", "plain" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ef"), "item" : "planner", "qty" : 75, "status" : "D", "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "tags" : [ "blank", "red" ] }

4.2.3. 深い階層部分に対する完全一致検索

深い階層部分に対して完全一致条件で検索。

$ db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )

{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ec"), "item" : "journal", "qty" : 25, "status" : "A", "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "tags" : [ "blank", "red" ] }

4.2.4. 深い階層部分に対する条件つき検索

深い階層部分に対して通常の条件つき検索。

$ db.inventory.find( { "size.uom": "in" } )

{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ed"), "item" : "notebook", "qty" : 50, "status" : "A", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "tags" : [ "red", "blank" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ee"), "item" : "paper", "qty" : 100, "status" : "D", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "tags" : [ "red", "blank", "plain" ] }

4.2.5. 配列型深い階層部分に対する検索

$ db.inventory.find( { tags: "red" } )

{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ec"), "item" : "journal", "qty" : 25, "status" : "A", "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "tags" : [ "blank", "red" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ed"), "item" : "notebook", "qty" : 50, "status" : "A", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "tags" : [ "red", "blank" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ee"), "item" : "paper", "qty" : 100, "status" : "D", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "tags" : [ "red", "blank", "plain" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ef"), "item" : "planner", "qty" : 75, "status" : "D", "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "tags" : [ "blank", "red" ] }

4.2.6. 配列型深い階層部分に対する完全一致検索

$ db.inventory.find( { tags: ["red", "blank"] } )
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ed"), "item" : "notebook", "qty" : 50, "status" : "A", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "tags" : [ "red", "blank" ] }

4.3. DB削除

今回登録して使ったDBinventoryを削除します。
db.dropDatabaseで削除し、show dbsでなくなっていることを確認します。

$ db.dropDatabase()
{ "dropped" : "inventory", "ok" : 1 }

$ show dbs
admin          0.000GB
config         0.000GB
local          0.000GB
myNewDatabase  0.000GB

4.4. シェル終了

シェルを終了します。

$ exit

5. Pythonラッパー PyMongo

5.1. インストール

pipを使ってPythonラッパーのPyMongoをインストールします。python仮想環境の管理はvenvを使っています。Pythonバージョンと仮想環境管理は記事「UbuntuにpyenvとvenvでPython開発環境構築」を参照ください。
PyMongo3.9.0がインストールされました。

pip install pymongo

jupyterを使ってPyMongoを動かします。

jupyter lab

5.2. Jupyter上でPython実行

ここからJupyter上でPythonを実行していきます。
「2.1. MongoDB起動」を事前にしています。

5.2.1. MongoDBへ接続

ローカルのMongoDBにデフォルトポートで接続し、クライアントを作成します。

from pymongo import MongoClient
client = MongoClient()

5.2.2. DBの取得/作成

今回はtest_databaseというDBを作成します。作成済の場合は、取得されるだけです。db = client['test-database']のような書き方もOK。

db = client.test_database

コマンドlist_database_namesを使えば、どんなDBがあるかを確認できます。

client.list_database_names()

5.2.3. コレクションの取得

コレクションを取得します。collection = db['test-collection']のような書き方もOK。

collection = db.test_collection

5.2.4. Insert

JSON形式でデータを準備してinsert_one関数でInsert。

import datetime
post = {"author": "Mike",
        "text": "My first blog post!",
        "tags": ["mongodb", "python", "pymongo"],
        "date": datetime.datetime.utcnow()}
posts = db.posts
post_id = posts.insert_one(post).inserted_id

find_one関数を使って結果確認をします。

import pprint
pprint.pprint(posts.find_one())

結果が出力されます。

{'_id': ObjectId('5d7a4f7055f20912298f04d4'),
 'author': 'Mike',
 'date': datetime.datetime(2019, 9, 12, 13, 59, 11, 121000),
 'tags': ['mongodb', 'python', 'pymongo'],
 'text': 'My first blog post!'}

find_one関数は、以下のように条件を追加することもできます。

pprint.pprint(posts.find_one({"author": "Mike"}))

5.2.5. Bulk Inserts(一括挿入)

insert_many関数を使ってBulk Inserts(一括挿入します)

new_posts = [{"author": "Mike",
               "text": "Another post!",
               "tags": ["bulk", "insert"],
               "date": datetime.datetime(2009, 11, 12, 11, 14)},
              {"author": "Eliot",
               "title": "MongoDB is fun",
               "text": "and pretty easy too!",
               "date": datetime.datetime(2009, 11, 10, 10, 45)}]
result = posts.insert_many(new_posts)
result.inserted_ids

5.2.6. クエリと複数結果

find関数を使うとCursorインスタンス

全検索だとすべてを取得できますし、

for post in posts.find():
    pprint.pprint(post)

条件を指定してももちろんOK。

for post in posts.find({"author": "Mike"}):
    pprint.pprint(post)

5.2.7. カウント

count_documents関数で結果をカウントします。

# 条件指定なし
posts.count_documents({})

# 条件指定
posts.count_documents({"author": "Mike"})

5.2.8. クエリ応用

少しクエリの応用です。ここでは条件演算子で<=を使い、結果をソートします。詳しくはOperatorsを参照ください。

d = datetime.datetime(2009, 11, 12, 12)
for post in posts.find({"date": {"$lt": d}}).sort("author"):
    pprint.pprint(post)

5.2.9. Indexing

インデックスの追加です。ここではユニークインデックスを追加しています。

from pymongo import ASCENDING
result = db.profiles.create_index([('user_id', ASCENDING)], unique=True)
sorted(list(db.profiles.index_information()))

6. MongoDB停止

ターミナル上からMongoDBの停止です。

sudo service mongod stop
7
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
FukuharaYohei
気の向いたままにいろいろと書きます。 仕事はSAP関連で、HANA、Fiori、SAPUI5、BusinessObjectsなどいろいろやっています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
7
Help us understand the problem. What is going on with this article?