LoginSignup
11
11

More than 5 years have passed since last update.

Mongodb 最短入門(1)EC2にインストール&起動&いきなり数万件入れてみた

Last updated at Posted at 2016-01-06

mongoDB のインストール &起動 &バルクインサート

2行でやりたかったけど。。すでにある epel リポジトリ にもmongoあったけど、うまく動かんかったよ

yum install --enablerepo=epel mongodb-org

  • ちゃんと公式のリポジトリ使ったほうがいいよ
  • いろんな人の書いてるリポジトリはふるいから公式いってみたほうがいいよ。

インストールできても、実行するとエラーになるよ
/usr/bin/mongod: symbol lookup error: /usr/bin/mongod: undefined symbol: _ZN7pcrecpp2RE4InitEPKcPKNS_10RE_OptionsE

EC2だかららしい。 /lib64/libpcre.so.0.0.1 とか変えるつもりないから、リポジトリからいったほうがいいよ
http://stackoverflow.com/questions/20872774/epel-mongodb-will-not-start-on-ec2-amazon-ami

おとなしく、リポジトリを追加から起動まで

今回はAmazon Linux用のページを参照した
https://docs.mongodb.org/manual/tutorial/install-mongodb-on-amazon/

※リポジトリのbaseurl で3.X 系 と 2.X 系を選ぶ。

yum.repos.dの追加

sudo vi /etc/yum.repos.d/mongodb.repo

[mongodb]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.2/x86_64/
gpgcheck=0
enabled=0

インストール

sudo yum install -y --enablerepo=mongodb mongodb-org

サービス起動

sudo service mongod start

はいはい、たちあがりました。

コンソール起動

mogo

試しに触ってみる

コマンドの公式Docmentはこちら

データ作る honyarara にJSON形式のデータをいれる

最初はtestというDBになっていて、use "dbname" で切り替えられる
おもむろになかったら作る系らしい。そういうの好きです。
honyarara がCollectionというデータセットの名前になるので好きなもので

db.honyarara.insert(
   {
     item: "test"
   }
)

データ探してみる honyarara 全部ください

db.honyarara.find()

入ってたね

探す item がtest って人ください

db.honyarara.find("item":"test")

見つかった。

終了!

quit()

バルクインサート

mongo はjavascript的な感じで
バルクインサートはこんなコマンド

db.collection.bulkWrite(
   [
      { insertOne : { "document" : { name : "sue", age : 26 } } },
      { insertOne : { "document" : { name : "joe", age : 24 } } },
      { insertOne : { "document" : { name : "ann", age : 25 } } },
      { insertOne : { "document" : { name : "bob", age : 27 } } },
      { updateMany: {
         "filter" : { age : { $gt : 25} },
         "update" : { $set : { "status" : "enrolled" } }
         }
      },
      { deleteMany : { "filter" : { "status" : { $exists : true } } } }
   ]
)

JSONでそんなことはやってられないので、CSVのgzipを解凍しながら、途中途中でいれながら数万件のレコードをいれてみる。

python で gz圧縮のテキストファイルを読み込みつつ1000件毎のバルクインサート

pymongo というのを使うのでインストール

pip install pymongo

CSVファイルを読み込んで、mongodbに保存するスクリプトを実行

python insert.py "filename.csv.gz"

おお!はや!600万件とかいれたけど順調

insert.py
# coding: utf-8
import pymongo
import sys
import csv
import gzip
#Client取得
client=pymongo.MongoClient()
#database取得
db=client.test
#Collection取得
mongo=db.hoge

#ひとつめの引数がCSVファイルのパス
infiename=sys.argv[1]
#CSVファイルに入っている順番でカラム名のリスト
keynames=('name','age','gender')
#カウンタ itemsのリストに追加しながら、指定件数に到達するとバルクインサート
i=0;
items=[]
#gzipを開けつつ―の
with gzip.open(infiename, 'r') as f:
#CSVを読みつつ―の delimiter の部分に区切り文字指定
    reader = csv.reader(f, delimiter=",")
    for row in reader:
#CSVの各行のデータにカラム名のキーをつけて辞書にして
        data=dict(zip(keys,row))
#リストに追加していく
        items.append(data)
        i=i+1
#1000件たまったら、フラッシュしてリセット
        if(i%1000==0):
            result=mongo.insert_many(items)
#入ったIDを返す
            #print result.inserted_ids
            items=[]
            i=0
#最後あまってたらいれる
if(i>0):
    mongo.insert_many(items)


11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11