私は奇妙な行動に気づきました。それは mongoid または mongodb かもしれませんが、よくわかりませんが、ドキュメントのカウントはドキュメントのフェッチよりも遅くなります。ここに私が発行したクエリがあります:
Institution.all.any_of(:portaled_at.ne => nil).any_of(portaled: true).order_by(:portaled_at.desc).count
# mongodb query and timing as per mongoid logs,
# times are consistent over multiple runs
# MONGODB (236ms) db['$cmd'].find({"count"=>"institutions", "query"=>{"$or"=>[{:portaled_at=>{"$ne"=>nil}}, {:portaled=>true}]}, "fields"=>nil}).limit(-1)
# MONGODB (245ms) db['$cmd'].find({"count"=>"institutions", "query"=>{"$or"=>[{:portaled_at=>{"$ne"=>nil}}, {:portaled=>true}]}, "fields"=>nil}).limit(-1)
Institution.all.any_of(:portaled_at.ne => nil).any_of(portaled: true).order_by(:portaled_at.desc).to_a
# mongodb query and timing as per mongoid logs
# times are not so consistent over multiple runs,
# but consistently much lower than count query
# MONGODB (9ms) db['institutions'].find({"$or"=>[{:portaled_at=>{"$ne"=>nil}}, {:portaled=>true}]}).sort([[:portaled_at, :desc]])
# MONGODB (18ms) db['institutions'].find({"$or"=>[{:portaled_at=>{"$ne"=>nil}}, {:portaled=>true}]}).sort([[:portaled_at, :desc]])
インデックスは mongodb for$and
およびクエリでは使用されないと思いますが、問題がある場合は、降順で$or
スパース インデックスを使用します。portaled_at
約 200,000 のドキュメントのうち、portaled_at が設定されているのは約 50 ~ 60 だけです。
- レール3.2.12
- モンゴイド 2.6.0
- モンゴッド 2.2.3
これは私の常識に反することであり、何が起こっているのか説明できる人がいれば、本当に感謝しています。