mongoDBインストールしてコンソールでCRUD試してみた

クローリングしてきたデータの保存先、最初はテキストでいいかと思っていたんですが やはり検索とか考えるとデータベースにぶち込んだ方がいいかなぁと思ってRDBを使うか、 はやりのNoSQLを使うかで悩んでいました。もともと保存しているテキストがJSON形式で あることと放り込んだデータに後から項目を追加するということも考えていたところもあって 柔軟性がほしいなぁと思ったのでmongoDBを使ってみることにしました。 pythonからいじくる予定なのですが、まずは動作検証してみたいということでmongoDBをインストール してみました。ま、よそで色々とされているのでコピペしてぶっ込んでみて、そして簡単にCRUDしてみた だけです。
ほとんど新しい知見はえられない記事です。

 ■手順

1.mongoDBインストール

#キーを入手
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
$ echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
$ sudo apt update

・mongodbインストール
$ sudo apt install -y mongodb-org

#動作確認
$ mongod --version
db version v4.0.13
git version: bda366f0b0e432ca143bc41da54d8732bd8d03c0
OpenSSL version: OpenSSL 1.1.1  11 Sep 2018
allocator: tcmalloc
modules: none
build environment:
    distmod: ubuntu1804
    distarch: x86_64
    target_arch: x86_64

matarain@crawler-srv:~$ mongo --version
MongoDB shell version v4.0.13
git version: bda366f0b0e432ca143bc41da54d8732bd8d03c0
OpenSSL version: OpenSSL 1.1.1  11 Sep 2018
allocator: tcmalloc
modules: none
build environment:
    distmod: ubuntu1804
    distarch: x86_64
    target_arch: x86_64

#mongodb起動
$ sudo systemctl start mongod
$ sudo systemctl enable mongod


2.セキュリティ設定(IDとPWでのログイン必須化)

$ mongo
MongoDB shell version v4.0.13
~中略~
onitoring()
---
> use sample
switched to db sample
> db.createUser({user: "user",pwd: "password",roles: [{ role: "userAdmin", db: "sample" },{ role: "dbAdmin", db: "sample" },{ role: "readWrite", db: "sample" }]})
Successfully added user: {
        "user" : "user",
        "roles" : [
                {
                        "role" : "userAdmin",
                        "db" : "sample"
                },
                {
                        "role" : "dbAdmin",
                        "db" : "sample"
                },
                {
                        "role" : "readWrite",
                        "db" : "sample"
                }
        ]
}

#設定ファイル編集
$ sudo vi /etc/mongod.conf
※以下を追記
----------------------------
security:
  authorization: enabled
----------------------------

#mongoDB再起動および動作確認
$ sudo systemctl restart mongod
$ mongo
MongoDB shell version v4.0.13
~中略~
MongoDB server version: 4.0.13
> use sample
switched to db sample
> db.auth("user", "password")
1
>
#documentの挿入
//現在日時で項目2つ
>db.test1.insert({new_column1: 'new_value1', new_column2: 'A9991', date_column: ISODate()})
>db.test1.insert({new_column1: 'new_value2', new_column2: 'A9992', date_column: ISODate()})
>db.test1.insert({new_column1: 'new_value3', new_column2: 'A9993', date_column: ISODate()})
>db.test1.insert({new_column1: 'new_value4', new_column2: 'A9994', date_column: ISODate()})
>db.test1.insert({new_column1: 'new_value5', new_column2: 'B9991', date_column: ISODate()})
>db.test1.insert({new_column1: 'new_value6', new_column2: 'B9992', date_column: ISODate()})
>db.test1.insert({new_column1: 'new_value7', new_column2: 'B9993', date_column: ISODate()})
>db.test1.insert({new_column1: 'new_value8', new_column2: 'B9994', date_column: ISODate()})

#collectionの検索
#2で終わるものを抽出(ObjectIDを除外して表示)
>db.test1.find({new_column2: /.*2$/},{_id:0})
#日付が現在日時以前で降順
>db.test1.find({date_column:{$lte:ISODate()}},{_id:0})
#日付が指定日時範囲内(日本時間で2019/11/11 15:01~15:13)
>db.test1.find({date_column:{$gte:ISODate("2019-11-11T06:01:00Z"),$lte:ISODate("2019-11-11T06:57:00Z")}},{_id:0})

#データをfindしてそのレコードを更新
#検索結果データに項目を追加
>db.test1.update({new_column2: /.*2$/}, {$set:{flg:'True'}}, false, true)
#検索結果データを更新
>db.test1.update({new_column2: /.*2$/}, {$set:{new_Column2:'C9992'}})

#collection削除
> show collections
test1
> db.test1.drop()
true
> show collections


次は構築したmongoDBの中にpython使って取得してきたJSONデータをブッ込むところです。 色々と調べてて思ったのがスケールする場合はNoSQLとはいえインデックスとか考えないと パフォーマンス出ないんじゃないかということ。 大規模なサービスで既存技術に精通した技術者がいない場合に、楽だからと新しいものに飛びつくと 実は余計に痛い目見たりするんじゃないかと個人的には思いました。

 ■参考サイト

https://websiteforstudents.com/install-mongodb-on-ubuntu-18-04-lts-beta-server/
https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=3370 https://lab4ict.com/system/archives/1137 https://qiita.com/h6591/items/68a1ec445391be451d0d https://qiita.com/thirdpenguin/items/4711e28f46cd9c7b09e4
https://it-blue-collar-dairy.com/add_auth_to_mongodb/ https://qiita.com/tomy0610/items/f540150ac8acaa47ff66
https://qiita.com/y-hara/items/83a86655bba48dc8b140 https://shoken.hatenablog.com/entry/20120405/p1 https://qiita.com/t2hk/items/45a04875dc6d8be9b004 https://qiita.com/tomy0610/items/ce45fa55dca10cb88083 https://codeday.me/jp/qa/20181129/27288.html https://qiita.com/saba1024/items/f2ad56f2a3ba7aaf8521 https://qiita.com/svjunic/items/285e9cf20169d70aa1fa

コメント

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)