引用关系的Mongoid标准

Nic*_*ima 2 mongodb mongoid

我有这两个型号:

class Track
  include Mongoid::Document
  field :artist, type: String
  field :title, type: String
  field :isrc, type: String
  has_many :subtitles
end

class Subtitle
  include Mongoid::Document
  field :lines, type: Array
  belongs_to :track
end
Run Code Online (Sandbox Code Playgroud)

如何检查是否存在具有某个'isrc'并且有字幕(无论有多少)的曲目?

我一直在尝试这个但似乎忽略了字幕标准:

Track.exists?(conditions: {isrc: my_isrc, :subtitles.exists => true})
Run Code Online (Sandbox Code Playgroud)

即使带有'isrc'的曲目没有字幕,它也会返回true.该怎么办?

Ram*_*Vel 8

你不能在mongo中这样做,因为Track和subtitle存储在不同的文档中.mongodb中的Exists命令只能验证自己文档中的字段,这里的关系在Tracktid文档中保存为track_id,而不是在Track文档中.所以Track没有字幕轨道.

实现此目的的一种简单方法是将您的关系从belongs_to更改为嵌入式.因此Track可以使用$ exists轻松验证字幕.

另一种方式是

Track.where(:isrc => my_isrc).select {|track| track.subtitles.count > 0}
Run Code Online (Sandbox Code Playgroud)

但是这个查询的缺点是对mongo进行多次往返以验证每个音轨的字幕数.