删除集合中所有重复的记录 - MongoDB

时间:2018-02-28 12:58:05

标签: javascript mongodb mongoose collections

我有一个mongoDB集合,如下所示。正如您所看到的,它有许多重复的记录,可能有一些不同的属性。现在在我的收藏中有18000个结果,我需要删除那里的所有重复项。我保持哪一个并不重要,我不需要欺骗。任何人都可以帮助或指出我正确的方向吗?对MongoDB来说很新。

提前致谢

{
  commonName: "Lionel Messi",
  firstName: "Lionel",
  lastName: "Messi",
  rating: 97
},{
  commonName: "Lionel Messi",
  firstName: "Lionel",
  lastName: "Messi",
  rating: 96
},{
  commonName: "Lionel Messi",
  firstName: "Lionel",
  lastName: "Messi",
  rating: 92
},{
  commonName: "Jamie Vardy",
  firstName: "Jamie",
  lastName: "Vardy",
  rating: 82
},{
  commonName: "Jamie Vardy",
  firstName: "Jamie",
  lastName: "Vardy",
  rating: 86
}

3 个答案:

答案 0 :(得分:1)

使用所有四个字段中的唯一索引创建临时集合,然后将数据从原始集合复制到临时集合,现在临时集合应仅包含唯一记录。在此之后,您可以清除原始收集记录并将记录从临时转移到原始收藏

答案 1 :(得分:1)

您可以使用aggregate清理数据,然后使用$out撰写收藏集,甚至覆盖当前收藏集:

db.players.aggregate([
  { 
    $group : {
      _id : { commonName: "$commonName"  },
      commonName: {$first: "$commonName"},
      firstName: {$first: "$firstName"},
      lastName: {$first: "$lastName"},
      rating: {$first: "$rating"},
    }
  },
  { $project : { _id:0, commonName:1, firstName:1, lastName:1, rating:1 } },
  { $out : "players" }
])

注意:如果您要撰写新收藏品,请使用{ $out : "newCollection" }

答案 2 :(得分:1)

您可以通过添加唯一索引来清理数据。 根据您的mongoDB版本,您有两种方式。

如果你的mongoDB版本是2.6或更早,那么你可以运行这个命令:

db.players.ensureIndex({'commonName' : 1, 'firstName' :1 }, {unique : true, dropDups : true})

如果您的版本较新,那么您可以执行以下操作:

db.players.aggregate([
{ "$group": {
   "_id": { "commonName": "$commonName", "firstName": "$firstName"},
   "dups": { "$push": "$_id" },
   "count": { "$sum": 1 }
}},
{ "$match": { "count": { "$gt": 1 } }}
]).forEach(function(doc) {
       doc.dups.shift();
       db.events.remove({ "_id": {"$in": doc.dups }});
});

db.players.createIndex({"commonName":1 , "firstName": 1},
{unique:true})

警告:您应首先尝试使用某些测试数据,以确保您没有删除所需的重要数据。