如果可能的话,我正在寻找一种更好的方法来使用令人惊叹的mongoid ODM驱动程序来操作现有的 mondodb 数据模型。
假设您有一个嵌入式一对多数据模型,如下所示:
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 >
但我想知道,是否有更好、更智能、更快、高效、有效、美观(或只是“不同”)的方式来做到这一点......