我有两种型号:

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

如何检查是否存在具有特定“ISRC”和字幕(无论有多少)的曲目?
我一直在尝试,但似乎忽略了字幕的标准:
Track.exists?(conditions: {isrc: my_isrc, :subtitles.exists => true})

即使带有“isrc”的曲目没有字幕,也会返回true。怎么办?

最佳答案

在mongo中不能这样做,因为track&subtitle存储在不同的文档中。exists命令在mongodb中只能验证自己文档中的字段,这里的关系在字幕文档中维护为track-id而不是track-document。所以音轨没有字幕音轨。
实现这一点的一个简单方法是将你的关系从“属于”改为“嵌入”。因此track可以使用$exists轻松验证字幕。
另一种方法是

Track.where(:isrc => my_isrc).select {|track| track.subtitles.count > 0}

但是,这个查询的缺点是多次往返mongo以验证每个曲目的字幕计数。

关于mongoid - 引用关系的Mongoid标准,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6892109/

10-16 13:03