カテゴリー : MongoDB

[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 で長さをチェックしている点です。

[MongoDB] MongoError: Runner error: Overflow sort stage buffered data usage of x bytes exceeds internal limit of 33554432 bytes

Express (Node.js) + Mongoose (MongoDB) なアプリケーションで下記のような MongoError が発生しました。

[ERROR] default - { [MongoError: Runner error: Overflow sort stage buffered data usage of 33555427 bytes exceeds internal limit of 33554432 bytes] name: 'MongoError' }
MongoError: Runner error: Overflow sort stage buffered data usage of 33555427 bytes exceeds internal limit of 33554432 bytes
  at Object.toError (/u/apps/com/shared/node_modules/mongoose/node_modules/mongodb/lib/mongodb/utils.js:114:11)
  at /u/apps/com/shared/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js:689:54
  at Cursor.close (/u/apps/com/shared/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js:972:5)
  at commandHandler (/u/apps/com/shared/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js:689:21)
  at /u/apps/com/shared/node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js:1847:9
  at Server.Base._callHandler (/u/apps/com/shared/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/base.js:445:41)
  at /u/apps/com/shared/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js:478:18
  at [object Object].MongoReply.parseBody (/u/apps/com/shared/node_modules/mongoose/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js:68:5)
  at [object Object].<anonymous> (/u/apps/com/shared/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js:436:20)
  at [object Object].EventEmitter.emit (events.js:95:17)
  at [object Object].<anonymous> (/u/apps/com/shared/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:201:13)
  at [object Object].EventEmitter.emit (events.js:98:17)
  at Socket.<anonymous> (/u/apps/com/shared/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js:439:22)
  at Socket.EventEmitter.emit (events.js:95:17)
  at Socket.<anonymous> (_stream_readable.js:746:14)
  at Socket.EventEmitter.emit (events.js:92:17)
  at emitReadable_ (_stream_readable.js:408:10)
  at emitReadable (_stream_readable.js:404:5)
  at readableAddChunk (_stream_readable.js:165:9)
  at Socket.Readable.push (_stream_readable.js:127:10)
  at TCP.onread (net.js:528:21)

sort に指定している field に index を張ってないのが原因でした。

Mongoose の schema 定義に下記のような感じで index 張れば対応完了です。

var User = new Schema({
  created_at: {
    type: Date,
    index: 1
  }
});
 
// or
 
User.index({
  created_at: 1
});

MongoDB に直接 index 張る場合は ensureIndex 使いましょう。

db.users.ensureIndex( { created_at : 1 } )

以上です。