Mongoid のクエリを最適化する
Mongoid で発行されるクエリを最適化するために知っておきたい機能
only メソッドで必要最低限のフィールドを取得
取得するフィールドを Mongoid::Criteria#only
で絞れる
Users.only(:name)
MongoDB の find()
クエリの第2引数の指定に相当する。
> db.users.find({});
{
"_id" : ObjectId("501676ca7f8e725b9caa7c31"),
"name" : "yulii",
"profile" : "Director of Web Development and Engineering",
"location" : "@ in AAAA ::1",
"url" : "https://yulii.github.io/"
}
> db.users.find({}, { name : 1 });
{
"_id" : ObjectId("501676ca7f8e725b9caa7c31"),
"name" : "yulii"
}
クエリ実行時間が劇的に速くなるわけではないが、データ通信量を減らすためにやっておくと良い。
includes メソッドで Eager Loading
どうしても Relation が必要なら、Mongoid::Criteria#includes
で Eager Loading すると良い。
Users.includes(:friend)
Relation じゃないときは、クエリを2回に分けて実行する。Mongoid::Criteria#only
で id
を取得して、欲しいデータを取得する
ids = Users.find().only(:id).map(&:id)
friends = Friends.find(ids)
参考URL
Mongoid - Object-Document-Mapper (ODM) for MongoDB written in Ruby