#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万件とかいれたけど順調
# 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)