可能であれば、素晴らしいmongoid ODMドライバーを使用して既存の mondodb データモデルを操作するためのより良い方法を探しています。
次のような 1 対多のデータ モデルが埋め込まれているとします。
class User
include Mongoid::Document
field :nickname
embeds_many :watchlists
end
class Watchlist
include Mongoid::Document
field :html_url
field :description
field :tags_array, type: Array
embedded_in :user
end
ここで、すべてのユーザーについて、すべてのウォッチリストの一部だけを抽出したいとします。
tags_array == ["ruby", "web", "framework"]
いくつかのフィールドのみを返します (ウォッチリストのドキュメント全体ではありません):
- ウォッチリストの html_url コンテンツ
- ウォッチリストの説明内容
と
- 関連する親のニックネーム ( User.nickname )
私はこのようなことを試しました:
1.9.2p290 :574 > Competitor = Struct.new(:html_url, :description, :user)
=> #<Class:0xed08de8>
1.9.2p290 :575 > competitors = []
=> []
1.9.2p290 :576 > User.all.map do |user|
1.9.2p290 :577 > user.watchlists.all.map do |wl|
1.9.2p290 :578 > if wl.tags_array == ["ruby", "web", "framework"]
1.9.2p290 :579?> competitors << Competitor.new(wl.html_url, wl.description, wl.user.nickname)
1.9.2p290 :580?> end
1.9.2p290 :581?> end
1.9.2p290 :582?> end
ここにいくつかの結果があります:
1.9.2p290 :585 > competitors
=> [#<struct html_url="https://github.com/rails/rails", description="Ruby on Rails", user="lgs">, #<struct html_url="https://github.com/sinatra/sinatra", description="Classy web-development dressed in a DSL (official / canonical repo)", user="lgs">]
1.9.2p290 :586 > competitors.size
=> 2
1.9.2p290 :599 > competitors[0][:html_url]
=> "https://github.com/rails/rails"
1.9.2p290 :600 > competitors[1][:html_url]
=> "https://github.com/sinatra/sinatra"
1.9.2p290 :601 >
しかし、それを行うための、より優れた、よりスマートで、より高速で、効率的で、効果的で、美的な(または単に「異なる」 )方法があるかどうか疑問に思います...