我有一個Ruby應用程序使用Mongoid和MongoDB v2.4.6。查詢大小的Mongo嵌入式文檔
我有以下MongoDB的結構,embeds_many
片段記錄:
{
"_id" : "76561198045636214",
"fragments" : [
{
"id" : 76561198045636215,
"source_id" : "source1"
},
{
"id" : 76561198045636216,
"source_id" : "source2"
},
{
"id" : 76561198045636217,
"source_id" : "source2"
}
]
}
我試圖找到在數據庫中包含片段,片段重複source_ids所有記錄。
我很確定我需要使用$ elemMatch,因爲我需要查詢嵌入式文檔。
我已經試過
Record.elem_match(fragments: {source_id: 'source2'})
其作品,但不限制文件的副本。
我又試圖
Record.elem_match(fragments: {source_id: 'source2', :source_id.with_size => 2})
返回任何結果(但它是一個有效的查詢)。查詢Mongoid產生的是:
selector: {"fragments"=>{"$elemMatch"=>{:source_id=>"source2", "source_id"=>{"$size"=>2}}}}
一旦這個工程,我需要更新它爲$大小是> 1。
這可能嗎?感覺就像我非常接近。這是一次性的清理操作,所以查詢性能不是太大問題(但是我們確實有數百萬條記錄需要更新!)
任何幫助都非常感謝!
我已經能夠達到預期的結果,但是在測試中它太慢了(需要數週的時間來運行我們的生產系統)。問題是每個記錄雙重查詢(我們有大約3000萬條記錄在製作中)。
Record.where('fragments.source_id' => 'source2').each do |record|
query = record.fragments.where(source_id: 'source2')
if query.count > 1
# contains duplicates, delete all but latest
query.desc(:updated_at).skip(1).delete_all
end
# needed to trigger after_save filters
record.save!
end
哇,很好的工作尼爾,我完全不會有我自己的!謝謝工作出色;) – daveharris