Skip to content

Instantly share code, notes, and snippets.

@wang-zhijun
Last active February 7, 2017 05:15
Show Gist options
  • Save wang-zhijun/bdb90d8bc32129b7d750b75d9262e1c0 to your computer and use it in GitHub Desktop.
Save wang-zhijun/bdb90d8bc32129b7d750b75d9262e1c0 to your computer and use it in GitHub Desktop.
MongoDB

Collectionの一覧を取得

> use athena
> db.auth("test_id", "test_id")
> db.getCollectionNames()

リモートのMongoDBに接続

mongo --port 27017 -u "test" -p "test" --host 10.1.2.3  --authenticationDatabase "test_db"

Error MongoDB-CR Authentication failed. Missing credentials in user document

http://stackoverflow.com/questions/29006887/mongodb-cr-authentication-failed

mongo
use admin
db.system.users.remove({})    <== removing all users
db.system.version.remove({}) <== removing current version 
db.system.version.insert({ "_id" : "authSchema", "currentVersion" : 3 })

MongoDB shutdown dbpathを調べてからshutdown

mongod --dbpath /var/lib/mongo --shutdown

MongoDBを起動

sudo mongod --auth --port 27017 --fork --syslog --dbpath /var/lib/mongo
sudo mongod -f /etc/mongod.conf

Centos7にMongoDBをインストール

/etc/yum.repos.d/mongodb-org.repo

[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc
sudo bash -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled"
sudo bash -c "echo never > /sys/kernel/mm/transparent_hugepage/defrag"

sudo yum install mongodb-org
sudo systemctl start mongod
sudo systemctl stop mongod
sudo systemctl reload mongod


MongoDBのコンテナを利用する時にユーザーパスワードで認証できるまでのことを書いておきます。

Imageは https://hub.docker.com/_/mongo/を使います。

ImageをPullしてくる

docker pull mongo

データを保存するたのData Volumeを作ります。

これだとコンテナに保存されるデータ(/data/dbにある)は全部ローカルホストの /mnt/general-use/docker-mongodb-dataに保存されて、MongoDBのコンテナを立ち上げる際にこのVolumeを使うといいです。

$ docker create --name mongo-data --volumes /mnt/general-use/docker-mongodb-data:/data/db centos

コンテナを立ち上げます。さっき作った mongo-dataというData Volumeを--volumes-fromオプションでMountします。

docker run -d --volumes-from mongo-data --name mongo -p 27017:27017 mongo

今の状態は認証のない状態で、これからadminデータベースに一番強い管理権限のadminユーザーを作って、さらにtest_idユーザーを作ります。

mongoという名前のコンテナにログイン

$ docker exec -it mongo /bin/bash

adminデータベースに接続

root@79504bfb1970:/# mongo admin
MongoDB shell version: 3.2.10
connecting to: admin

これからadminという名前のユーザーを作る, ロール userAdminAnyDatabaseはかなり強力です。adminユーザーを作った後にそこで一回認証して、adminユーザーにログイン

> db.createUser({user: "admin", pwd: "password", roles: [{role: "userAdminAnyDatabase", db: "admin"}]})
Successfully added user: {
        "user" : "admin",
        "roles" : [
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ]
}


> db.auth("admin", "password")
1

adminユーザーで認証した後にtest_idというユーザーを作ります

> db.dropUser("test_id")
true
> db.createUser({user: "test_id", pwd: "test_id", roles: [{role: "readWrite", db: "user_accounts"}]})
Successfully added user: {
        "user" : "test_id",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "user_accounts"
                }
        ]
}

これでtest_idというユーザーを作ったから。さっき立ち上がったコンテナを削除して、認証つきの--authオプションをつけてもう一回立ち上げます。

$ docker stop mongo && docker rm mongo

$ docker run -d --volumes-from mongo-data --name mongo -p 27017:27017 mongo --auth

これでローカルのMacからも MongoclientのようなGUIツールからuser_accountsというデータベースにアクセスできるようになりました。

$ mongo
MongoDB shell version: 3.2.10
connecting to: test
> use goinggo
switched to db goinggo

> var a = new Timestamp();

> db.mycollection.insert({ts: a}); // timestampをinsert
WriteResult({ "nInserted" : 1 })


> show dbs # 有効なデータベスをチェック
athena  0.000GB
local   0.000GB
test    0.000GB


> # データベース作成
> use temp-db
> show dbs
> db.movie.insert({"name": "tutorials point"})
> show dbs

> Collectionを作成
> use temp-db
switched to db temp-db
> db.createCollection("mycollection")
{ "ok" : 1 }
> show collections
movie
mycollection

> # Collectionを削除
> db.mycollection.drop()
true
> show collections
movie


> Collectionの中のすべてのドキュメントを検索
> db.movie.find()
{ "_id" : ObjectId("5809a0c70fe81c45e6de7ec8"), "name" : "tutorials point" }


> # 特定のトキュメントを検索
> db.movie.insert({"name": "aws cloud"})
WriteResult({ "nInserted" : 1 })
> db.movie.insert({"name": "google cloud"})
WriteResult({ "nInserted" : 1 })

> db.movie.find({"name":"aws cloud"})
{ "_id" : ObjectId("5809a2de0fe81c45e6de7ec9"), "name" : "aws cloud" }


> ドキュメントを更新
> db.movie.update({"name": "aws cloud"}, {$set:{"name": "aws cloud is awesome"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> save()を使ってドキュメントを更新
> db.movie.save({"_id":ObjectId("5809a0c70fe81c45e6de7ec8"), "name": "mongodb tutorials point"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

ユーザーを作成 https://docs.mongodb.com/v3.2/reference/method/db.createUser/

db.createUser({user: "test_id", pwd: "test_id", roles: [{role: "readWrite", db: "user_accounts"}]})

ユーザーリストと特定のユーザー情報

> use user_accounts
switched to db user_accounts
> db.getUsers()
[
        {
                "_id" : "user_accounts.test_id",
                "user" : "test_id",
                "db" : "user_accounts",
                "roles" : [
                        {
                                "role" : "readWrite",
                                "db" : "user_accounts"
                        }
                ]
        }
]
> db.getUser("test_id")
{
        "_id" : "user_accounts.test_id",
        "user" : "test_id",
        "db" : "user_accounts",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "user_accounts"
                }
        ]
}

ユーザーを削除

> db.dropUser("test_id")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment