穏やかなリマインダー:
All queries in Mongoid are Criteria, which is a chainable and lazily evaluated wrapper to a MongoDB dynamic query.
参照: http: //mongoid.org/en/mongoid/docs/querying.html#query_plus
Mongoid Criteriaが遅延評価されることを理解してください。そうしないと、混乱が生じ、時間と時間がかかります...
@result = User.find(:name => "xxxxx")。limit(5)を実行すると、Mongoid :: Errors::DocumentNotFound例外が発生します。これはMongoid2.4.10の場合です。あなたの質問は正確ですか?
これをUser.whereに変更しました。@result= User.find(:name => "xxxxx")。limit(5)はCriteriaであり、(まだ)MongoDBから読み取られたUserインスタンスではありません。
次のテストは、遅延評価のために、DBクエリが必要な場合にのみ発生することを明確にするのに役立ちます。たとえば、メソッドto_jsonとメソッドの長さの後などです。また、ログを調整し、to_jsonまたはlengthメソッドで@resultを使用するたびに、DBクエリが繰り返されることに注意してください。これは非効率的で、おそらく意図したものではありません。Enumerable#to_aやEnumerable#eachなどのメソッドを使用して、評価とフェッチを強制できます。
test / unit / user_test.db
require 'test_helper'
class UserTest < ActiveSupport::TestCase
def setup
User.delete_all
end
test "mongoid lazy eval" do
User.create(name: 'xxxxx')
assert_equal(1, User.count)
puts "User.all.to_a: #{User.all.to_a.inspect}"
assert_raises Mongoid::Errors::DocumentNotFound do
@result = User.find(:name=>"xxxxx").limit(5)
end
puts "@result = User.find(:name=>\"xxxxx\").limit(5); @result: #{@result.inspect}"
@result = User.where(:name=>"xxxxx").limit(5)
puts "@result = User.where(:name=>\"xxxxx\").limit(5); @result.class: #{@result.class}"
puts "@result.to_json: #{@result.to_json}"
puts "@result.length: #{@result.length}"
@new_result ={:result =>@result, :count=>@result.length}
puts "@new_result: #{@new_result.inspect}"
puts "@new_result.to_json: #{@new_result.to_json}"
end
end
テスト出力
Run options: --name=test_mongoid_lazy_eval
# Running tests:
User.all.to_a: [#<User _id: 4fca03e7e4d30b1e42000001, _type: nil, name: "xxxxx">]
@result = User.find(:name=>"xxxxx").limit(5); @result: nil
@result = User.where(:name=>"xxxxx").limit(5); @result.class: Mongoid::Criteria
@result.to_json: [{"_id":"4fca03e7e4d30b1e42000001","name":"xxxxx"}]
@result.length: 1
@new_result: {:result=>#<Mongoid::Criteria
selector: {:name=>"xxxxx"},
options: {:limit=>5},
class: User,
embedded: false>
, :count=>1}
@new_result.to_json: {"result":[{"_id":"4fca03e7e4d30b1e42000001","name":"xxxxx"}],"count":1}
.
Finished tests in 0.038161s, 26.2048 tests/s, 52.4095 assertions/s.
1 tests, 2 assertions, 0 failures, 0 errors, 0 skips