mongoシェルのeditコマンドを使う

# 概要

下記のように**mongoシェル**を使って困ることがあります。`edit`コマンドを使って解消しましょう。

###  mongoシェルで困ること
**mongoシェル**で困ることはコマンドや関数を実行した結果がスクロールして先頭が見にくいことが良くあります。例えば次ようなコマンドを実行します。

```:mongo
> db.serverStatus()
```

この結果は次のようになり先頭のほうが見えないのでスクロールバーを操作して先頭を見なければなりません。

```:mongo
                               "readersCreated" : NumberLong(0)
                        },
                        "preload" : {
                                "docs" : {
                                        "num" : 0,
                                        "totalMillis" : 0
                                },
                                "indexes" : {
                                        "num" : 0,
                                        "totalMillis" : 0
                                }
                        }
                },
                "storage" : {
                        "freelist" : {
                                "search" : {
                                        "bucketExhausted" : NumberLong(0),
                                        "requests" : NumberLong(0),
                                        "scanned" : NumberLong(0)
                                }
                        }
                },
                "ttl" : {
                        "deletedDocuments" : NumberLong(0),
                        "passes" : NumberLong(899)
                }
        },
        "ok" : 1
}
>
```

こんなときは`edit`コマンドを使いましょう。

# editコマンドを使うための設定
まず、**mongoシェル**上で`EDITOR`変数に使いたい外部エディタプログラムを代入します。例としてWindowsの**メモ帳**を指定します。使いたいエディタにパスが通っていないときはフルパスを指定します。

```:mongo
> EDITOR='notepad'
```

Linuxなどでは`vi, vim`でしょう。文字列検索には`vim`が便利なのでWindowsでも`vim`を使っています。上記の方法では**mongoシェル**を起動ごとに設定しなければなりませんので、システムの環境変数に設定することもできます。

 ```
set EDITOR=notepad   #windows cmd.exe

export EDITOR=vi     #linux bash
```


# editコマンドの使い方

エディタの設定ができたので実際の使い方です。

```:mongo
> var result = db.serverStatus()
> edit result
```

見たいコマンドの実行結果を変数に代入して、その変数に対して`edit`コマンドを使います。そうするとエディタ（メモ帳）が立ち上がり`result`の内容がメモ帳で見ることができます。エディタ（メモ帳）を閉じるまで`edit`コマンドが終了しませんので注意が必要です。

![notepad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258007/3d7334ae-9dc7-3303-fd13-42e7885ea571.png)

# find結果のドキュメントをエディタで見る

エディタで見ることがでるのは当然テキストだけなので`db.collection.find()`の結果を変数に代入してもドキュメントを見ることはできません。なぜなら`db.collection.find()`が返すのはカーソルオブジェクトだからです。 そこで`toArray()`を使います。

```:mongo
var result = db.colllection.find().toArray()
edit result
```

ただし、`db.collection.findOne()`はドキュメントを返しますので直接変数に代入してエディタで見ることができます。`find()`で出力件数が多いときは`limit()`を使って制限します。その他のコマンドでもドキュメントや文字列を返さないもコマンドもあるので必ず文字列に変換してから使います。

# Javascriptの関数をエディタで作成する
`edit`コマンドは一時的な関数やデータなどを作成・編集が本来の機能です。そこで簡単な関数`func1`を作成してみます。まず、`edit`コマンドでエディタを立ち上げます。

```:mongo
> edit func1
```

エディタが立ち上がりますので、`func1`のコーディングをします。例としてコレクションのすべてのドキュメントを出力する関数です。

```javascript:エディタ
function() {
   db.collection.find().forEach((doc) => {
       printjson(doc);
   });
}
````

エディタで上書き保存して終了します。文法にエラーがあると`func1`変数は上書きされませんので、もう一度入力しください。だたし、エラーの場合`func1`に上書きされていませんので入力したものは消えてしまい、前の状態です。　無事`func1`に代入できたら`func1`を実行します。

```:mongo
> func1()

collectionの全ドキュメントが出力される
```

`func1`を変更したい場合はエディタを再度立ち上げて編集できます。

# insertするドキュメントをエディタで作成する

```:mongo
> edit docs
```

エディタで次のようなデータを作成します。

```:エディタ
[
  {a:1, b:101},
  {a:2, b:102},
  {a:3, b:103}
]
```

上記のドキュメントが`docs`変数の代入されますので、これを使って`insert`する。

```:mongo
> db.collection.insert(docs)
```
# エディタを切り替えるJavascript
ユーザーのホームディレクトリに`.mongorc.js`があると`mongo`を立ち上げたときに読み込まれるので、ここで`EDITOR`変数にセットする関数を用意します。

```javascript:.mongorc.js

//デフォルトのエディタ
EDITOR='vim';

function vim() {
    EDITOR='vim';
}
function notepad() {
    EDITOR='notepad';
}
```

デフォルトが`vim`なので**メモ帳**に変更する。

```:mongo
> notepad()
```