我有一个有冗余数据的集合。
示例数据:
{
unique_index : "1"
other_field : "whatever1"
},
{
unique_index : "2"
other_field : "whatever2"
},
{
unique_index : "1"
other_field : "whatever1"
}
我运行了查询:(我必须使用allowDiskUse:true
,因为有很多数据)
db.collection.aggregate([
{
$group: {
_id: "$unique_index",
count: { $sum: 1 }
}
},
{ $match: { count: { $gte: 2 } } }
], { allowDiskUse: true })
我得到了这个输出:(例如)
{ "_id" : "1", "count" : 2 }
.
.
现在的问题是我只想保留一个数据。我想删除所有冗余数据。请注意其大量数据,如超过100,000条记录或其他内容。我正在寻找快速简便的解决方案(在mongodb或RoR,因为我正在使用Ruby on Rails),如果任何人可以提供帮助,将不胜感激。
答案 0 :(得分:1)
如果您不关心_id
,最简单的方法是选择不同的文档到新的集合中,然后重命名它:
db.collection.aggregate([
{$group: {
_id: "$unique_index",
other_field: {$first: "$other_field"}
}},
{$project: {
_id: 0,
unique_index: "$_id",
other_field:1
}},
{$out: "new_collection"}
]);
db.new_collection.renameCollection("collection", true);
请记住,您需要恢复所有索引。此外renameCollection
无法处理分片合并。