我有一个使用Mongoid和MongoDB v2.4.6的Ruby on Rails应用程序。
我有以下MongoDB结构,一条记录嵌入了许多碎片:
{
"_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}}}}
一旦这项工作完成,我需要将其更新为 $size 大于 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