我在Ruby中使用mongoid-history gem和mongoid。我实际上将mongo历史链接到一个名为SocialPost的模型,所以我可以做类似的事情。
history = current_user.social_posts.history_tracks
现在我需要过滤这个历史记录'使用范围或方法过滤属性' association_chain'从历史跟踪模型,但' history_tracks'属性是这样做的:
<HistoryTracker _id: 57bdc1cb65e59325ae000001, created_at: 2016-08-24 15:48:27 UTC, updated_at: 2016-08-24 15:48:27 UTC, association_chain: [{"name"=>"SocialPost", "id"=>BSON::ObjectId('57ac8b0f65e5930944000000')}], modified: {"facebook_likes_count"=>2594213, "tweeter_followers_count"=>0}, original: {}, version: 1, action: "update", scope: "social_post", modifier_id: nil>
那么,我如何在我的HistoryTracker模型中创建一个搜索,允许我在association_chain中搜索特定的一组id,如下所示:
HistoryTracker.where(:association_chain.in => {"name"=>"SocialPost", "id"=>[GROUPS OF IDS TO SEARCH]}
使用$ elemMatch更新
#test case multiple social_id: empty result
HistoryTracker.any_in({:association_chain.elem_match => [{name: 'SocialPost', :id.in => social_ids}] })
#test case 1 social_id: match result
HistoryTracker.any_in({:association_chain.elem_match => [{name: 'SocialPost', :id => social_ids.first}] })
答案 0 :(得分:0)
我发现已经有了一个可行的解决方案。 elemMatch应该与你需要收集的ID组合在一起,所以这就是我所做的:
social_ids = [BSON::ObjectId('...1'), BSON::ObjectId('...2'), BSON::ObjectId('...3')]
#reorder the ids with the extra hash elements
a = []
social_ids.each do |id_bson|
a << {name: 'SocialPost', id: id_bson}
end
现在您创建了'QUERY'
HistoryTracker.any_in({:association_chain.elem_match => a})