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

Javascript 删除集合中的所有重复记录-MongoDB,javascript,mongodb,mongoose,collections,Javascript,Mongodb,Mongoose,Collections,我有一个类似这样的mongoDB集合(如下)。正如您所看到的,它有许多重复记录,可能有一些不同的属性。现在在我的收藏中有18000个结果,我需要删除其中的所有重复项。我不在乎我保留哪一个,我只是不需要被骗。有人能帮我或给我指出正确的方向吗 { commonName: "Lionel Messi", firstName: "Lionel", lastName: "Messi", rating: 97 },{ commo

我有一个类似这样的mongoDB集合(如下)。正如您所看到的,它有许多重复记录,可能有一些不同的属性。现在在我的收藏中有18000个结果,我需要删除其中的所有重复项。我不在乎我保留哪一个,我只是不需要被骗。有人能帮我或给我指出正确的方向吗

{
  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
}

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

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

您可以使用
聚合
清理数据,然后使用
$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”}
您可以使用
聚合
清理数据,然后使用
$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”}

添加唯一索引来清理数据。 根据您的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})

警告:您应该首先在某些测试数据上尝试此操作,以确保您没有删除所需的重要数据。

您可以通过添加唯一索引来清理数据。 根据您的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})

警告:您应该首先在一些测试数据上尝试此操作,以确保您没有删除所需的重要数据。

您可以创建一个新集合,这是一些数据清理操作的结果,检查数据,然后可以重命名集合。您可以创建一个新集合,这是一些数据清理操作的结果,检查数据,然后您可以重命名集合。令人惊讶的是,我将尝试这样做!听起来像个愚蠢的问题,但我应该在哪里运行这样的脚本?在终端机里,而在玩家系列里?一点也不傻。我将以惊人的速度运行该脚本,谢谢。为什么_id和具有与commonValue相同的值?聚合器正在比较这些值以检查它们是否相同吗?@SamKelham如果答案能为您的问题提供解决方案,请接受/upvote。我会在实现它后执行:)太棒了,我会尝试这样做!听起来像个愚蠢的问题,但我应该在哪里运行这样的脚本?在终端机里,而在玩家系列里?一点也不傻。我将以惊人的速度运行该脚本,谢谢。为什么_id和具有与commonValue相同的值?聚合器正在比较值以检查它们是否相同吗?@SamKelham如果答案能解决您的问题,请接受/upvote。我将在实现后执行:)