Mongo DB,删除冗余数据,如何从集合中删除重复的唯一索引

时间:2016-09-28 11:07:59

标签: ruby-on-rails mongodb mongodb-query aggregation-framework mongodb-aggregation

我有一个有冗余数据的集合。

示例数据:

{
    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),如果任何人可以提供帮助,将不胜感激。

1 个答案:

答案 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无法处理分片合并。