読者です 読者をやめる 読者になる 読者になる

【MongoDB】コマンドラインで特定フィールドの値だけを出力する

Macで開発

f:id:kitahashi-ryoichi:20160306164601j:plain

コマンドラインだけでMongoDBの特定のフィールドの値だけを抜きたい!

本記事のゴール

mongodbの特定フィールドの値だけをファイルに抽出することができる

 

 

テストデータ

db.test.insert({id:1,value:"BOSS"});
db.test.insert({id:2,value:"FIRE"});
db.test.insert({id:3,value:"ジョージア"});
db.test.insert({id:4,value:"WANDA"});
db.test.insert({id:5,value:"マウントレーニア"});

 

必要なもの 

インストールは2パターン(お好きな方を)

  1. npmでインストール
    npm install -g JSON.sh
  2. コードだけ取得
    wget https://raw.githubusercontent.com/dominictarr/JSON.sh/master/JSON.sh
    chmod +x JSON.sh

 

手順

find({検索クエリー},{出力フィールド})で、valueだけ出力する

0: 出力しない, 1: 出力する(デフォルトは出力する)

mongo test --eval 'var cursor = db.test.find({},{_id:0,value:1});
while (cursor.hasNext()) {
    var doc = cursor.next();
    printjson(doc);
}'

結果

{ "value" : "BOSS" }
{ "value" : "FIRE" }
{ "value" : "ジョージア" }
{ "value" : "WANDA" }
{ "value" : "マウントレーニア" }

 

値だけを出力する

パイプでBashコマンド繋げるだけ

mongo --eval 'var cursor = db.test.find({},{_id:0,value:1});
while (cursor.hasNext()) {
    var doc = cursor.next();
    printjson(doc);
}' | 
tail -n+3 |
while read line; do echo $line | ./JSON.sh -l -s; done |
awk -F '\t' '{print $2}'

 

結果

"BOSS"
"FIRE"
"ジョージア"
"WANDA"
"マウントレーニア"

 

ダブルクオートを除去

mongo --eval 'var cursor = db.test.find({},{_id:0,value:1});
while (cursor.hasNext()) {
    var doc = cursor.next();
    printjson(doc);
}' | 
tail -n+3 | 
while read line; do echo $line | ./JSON.sh -l -s; done | 
awk -F '\t' '{print $2}'|
tr -d '"'

 

値だけになればsort -uとかで重複除外してみたりコネコネできます。

 

まとめ

こんなにシェルを使うと「え?」っていう反応が多いですが、Bashだとどこでも動くし環境作らなくても良いので便利だったりします。逆に保守性とか拡張性は全然ないのでスポットの作業なんかで使えるかなー。