カテゴリー : MongoDB

[MongoDB] mongo shell から別DBへ接続してクエリを実行する

MongoDB で別データベースに接続してクエリを実行する方法をメモ。

前提

2つの DB サーバで保存する collection を分けて管理しているとします。

データベース1

  • Host: mongodb1
  • Port: 27017
  • DB: myDb

データベース2

  • Host: mongodb2
  • Port: 27017
  • DB: myDb

別 DB への connection を作成する方法

mongo shell で query を実行するときに別 DB の collection も扱いたい場合、その DB への connection を作成してあげればいいです。

$ mongo mongodb1/myDb
mongodb1> db2 = connect("mongodb2:27017/myDb")
connecting to: mongodb2:27017/myDb
myDb
 
// mongodb2 サーバにの mdDb に保存されている somecollections のデータを扱うことができる
mongodb1> db2.somecollections.findOne()

DB サーバが1台のときは気にしなくてよかったのですが、複数台になると別 DB サーバへのコネクションを扱う Tips も知っておけば今までどおり mongo shell からクエリを実行しまくれますね。


参考情報

connect() — MongoDB Manual 2.6.7

別DBへのコネクションを扱う : MongoDB – Mongo shellの裏技色々 – Qiita

[MongoDB] aggregate の実行時間を確認する方法

mongo shell で db.collection.aggregate() の実行時間を確認するコマンドをメモ。

time mongo dbname –eval ‘query’ で実行時間を確認する

bash や zsh などから time コマンドを使って mongo –eval でクエリを渡して、実行時間を確認しました。

$ time mongo dbname --eval 'db.orders.aggregate([ { $match: { customer_id: "abcdefg", payment_system: "paypal" } } , { $group: { _id: "$user" } } ])'
MongoDB shell version: 2.6.5
connecting to: dbname
[object Object]
 
real	0m0.120s
user	0m0.044s
sys	0m0.004s

aggregate の explain オプションではダメなのか?

db.collection.aggregate(pipeline, options) の第二引数に explain を Boolean で指定できます。

しかし、これは db.collection.find().explain() の実行結果とは少し違うみたいで、実行時間については確認できませんでした。

  db.users.aggregate( [ ], { explain: true } )
{
	"stages" : [
		{
			"$cursor" : {
				"query" : {
 
				},
				"plan" : {
					"cursor" : "BasicCursor",
					"isMultiKey" : false,
					"scanAndOrder" : false,
					"allPlans" : [
						{
							"cursor" : "BasicCursor",
							"isMultiKey" : false,
							"scanAndOrder" : false
						}
					]
				}
			}
		}
	],
	"ok" : 1
}

time コマンドを使う以外のやり方をご存知でしたら教えて下さい!


参考情報

db.collection.aggregate() — MongoDB Manual 2.6.6

[MongoDB] mongo shell での表示件数は DBQuery.shellBatchSize で設定できる

mongo shell での表示件数はデフォルト 20 件なのですが、これを変更するには DBQuery.shellBatchSize の値を変更すればいいみたいです。

// 表示件数を 500 件にしたい場合
DBQuery.shellBatchSize = 500;

クエリの結果が何件とか予め分かっている場合、その件数を設定すれば一度に結果を全件出力できるので it を入力しなくてよくて便利だったりします。

db.users.find()
...
Type "it" for more
 
// 普段だったら 20 件ごとに it を入力しないといけない

以上です。


参考情報

How to print out more than 20 items (documents) in MongoDB's shell? – Stack Overflow

Getting Started with the mongo Shell — MongoDB Manual 2.6.4

MongoDB の GUI クライアント

MongoDB を mongo shell からでなく GUI クライアントから操作できた方が楽なこともあると聞いて、アプリ入れてみました。

とりあえず、開発環境で使うために Robomongo をインストールしてみました。

Robomongo — shell-centric MongoDB management tool (MongoDB Admin UI)

しばらく、使ってみたいと思います。

[MongoDB] 特定のテキストフィールドが x 文字以上の document を取得する query

MongoDB で特定のテキストフィールドが x 文字以上の document を取得する query をメモ

db.users.find( { name : { $ne: null }, $where: "this.name.length > 5" } )

ポイントは name フィールドに値が存在する場合のみ、$where で長さをチェックしている点です。