なぜこれが機能するのか:
# mongo dbname
MongoDB shell version: 1.8.3
connecting to: nextmuni_staging
> db.collection.find()
{ "foo" : "bar" }
> bye
これは機能しませんが、
# mongo localhost/dbname --eval 'db.collection.find()'
MongoDB shell version: 1.8.3
connecting to: localhost/dbname
DBQuery: dbname.collection -> undefined
まったく同じはずですよね?
ありがとう!
ベストアンサー1
の戻り値db.collection.find()
はカーソル型です。シェル内からこのコマンドを実行すると、カーソルが作成され、データの最初のページが表示されます。「it」コマンドを繰り返すことで、残りのページに進むことができます。
評価されたスクリプトの実行中に使用される変数のスコープは、スクリプトの有効期間のみであると思います (もちろん、データはコレクションに保持できます)。そのため、スクリプトが終了すると、それらのカーソル変数は存在しなくなり、別の評価スクリプトを送信してデータをページングできるようになります。したがって、シェル セッション中に得られる動作は、評価スクリプトからは実際には機能しません。
この動作に近づけるには、次のようなコードを実行します。
mongo dbname --eval "db.collection.find().forEach(printjson)"
これは、コマンドが実行され、カーソルが生成され、それを反復処理して出力を stdout に送信できることを示しています。
編集: 私が言おうとしていたのは、発行したコマンドは機能しているが、出力が期待したものと異なるということだと思います。