Mongoid 条件の結果をクエリして、フィールドが異なるドキュメントのみを保持しようとするので、非常にイライラします。そしてこれを行う:
Books.all.distinct(:name)
..ドキュメントではなく、名前フィールドのみを返します。
また、uniq
ここで別の質問に記載されているようにループを使用しても機能しません。
Books.all.uniq{|x| x.name} # Returns non-unique results
ここで何が欠けていますか?
Mongoid 条件の結果をクエリして、フィールドが異なるドキュメントのみを保持しようとするので、非常にイライラします。そしてこれを行う:
Books.all.distinct(:name)
..ドキュメントではなく、名前フィールドのみを返します。
また、uniq
ここで別の質問に記載されているようにループを使用しても機能しません。
Books.all.uniq{|x| x.name} # Returns non-unique results
ここで何が欠けていますか?
OP、あなたの問題は、すべての本に一意の名前が必要なことです。
この問題は、98 冊のユニークな本と、同じ名前の本が 2 冊あるとします。
データベースに「一意の名前の本をすべてください」と尋ねると、最初の 98 本が検索され、次に最後の 2 本が検索されます。
同じ名前の 2 冊の本のうち、どれを返す必要がありますか? 詳細レベルを考えると、この質問に対する正しい答えはないため、架空の .uniq のようなものは意味がありません。
あなたが達成しようとしていることを完全に理解しているかどうかわかりませんか?データベースの「名前」フィールドに一意の制約がありますか?
その場合、すべての本の名前を取得するだけです。本自体を取得するには、ベース オブジェクトを呼び出します。
そうでない場合、名前ごとに複数の本が存在することになり、distinct で取得する意味がありません。おそらく、あなたが探しているのは groupby 関数ですか? すべての本を同じ名前でグループ化するには、 を呼び出すことができますBooks.all.group_by{|book| book.name}
が、これはデータベース レベルではなく Web サーバーに対して実行されるため、妥当な量のレコードに対しては非常に遅くなります。
あなたの最善の策は、おそらく次のいずれかを行うことです。