从mongodb 4.0中删除重复的记录

时间:2019-02-04 14:03:23

标签: mongodb

我有一个具有重复记录的集合。我正在使用mongodb 4.0。如何从整个集合中删除重复的记录?

正在使用以下结构插入记录 {item:“ journal”,数量:25,大小:15,状态:“ A”}

我需要做的是为一个文档创建唯一记录。

3 个答案:

答案 0 :(得分:1)

我最近创建了一个代码来从 MongoDB 中删除重复的文档,这应该可以工作:

const query = [
  {
    $group: {
      _id: {
        field: "$field",
      },
      dups: {
        $addToSet: "$_id",
      },
      count: {
        $sum: 1,
      },
    },
  },
  {
    $match: {
      count: {
      $gt: 1,
      },
    },
  },
];

const cursor = collection.aggregate(query).cursor({ batchSize: 10 }).exec();

cursor.eachAsync((doc, i) => {
  doc.dups.shift(); // First element skipped for deleting
  doc.dups.map(async (dupId) => {
    await collection.findByIdAndDelete({ _id: dupId });
  });
});

答案 1 :(得分:0)

您可以使用聚合管道将重复的记录分组:

db.theCollection.aggregate([
   {$group: {_id: {item: "$item", qty: "$qty", size: "$size", status: "$status"}}},
   {$project: {_id: 0, item: "$_id.item", qty: "$_id.qty", size: "$_id.size", status: "$_id.status"}},
   {$out: "theCollectionWithoutDuplicates"}
])

执行聚合管道后,theCollectionWithoutDuplicates集合包含每个原始重复文档组的文档,并带有一个新的_id-您可以验证输出,删除原始集合({{1 }},并重命名新集合(db.theCollection.drop())。拖放和重命名可以在db.theCollectionWithoutDuplicates.renameCollection('theCollection')中组合。

聚合管道使用量的预计:

  1. db.theCollectionWithoutDuplicates.renameCollection('theCollection', true)执行聚合管道,接收要执行的聚合阶段列表
  2. db.theCollection.aggregate([])阶段按指定为后续$group字段的字段分组文档
  3. _id阶段更改字段名称,展平$project产生的嵌套_id子文档
  4. $group阶段将聚合结果文档存储到给定集合中

答案 2 :(得分:0)

您可以使用forEach删除重复的记录:

db.collection.find({}, { item: 1, qty: 1, size: 1, status: 1 }).forEach(function(doc) {
    db.collection.remove({_id: { $gt: doc._id }, item: doc.item, qty: doc.qty, size: doc.size, status: doc.status })
})