【问题标题】:Delete all duplicates of record in collection - MongoDB删除集合中记录的所有重复项 - MongoDB
【发布时间】:2018-08-08 08:51:10
【问题描述】:

我有一个这样的 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
}

【问题讨论】:

  • 可以新建一个集合,就是一些数据清理操作的结果,检查数据,然后可以重命名集合。

标签: javascript mongodb mongoose collections


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你可以使用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" }

    【讨论】:

    • 太棒了,我会尝试这样的事情!听起来像一个愚蠢的问题,但我会在哪里运行这样的脚本?在终端机中同时在玩家收藏中?
    • 根本没有愚蠢的问题。我将在MongoDB Shell 中运行该脚本
    • 太棒了,谢谢。为什么 _id 和 commonValue 有相同的值? _id 是聚合器正在比较的值以检查它们是否相同吗?
    • @SamKelham 如果答案能解决您的问题,请接受/支持。
    • 当我实现它时我会做的:)
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-04
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多