mongodb - 从 mongo db 中删除除一个重复项之外的所有重复项
问题描述
所以我犯了这个错误,两次保存了很多文档,因为我弄乱了我的文档 ID。因为我做了一个插入,所以每次我保存它们时都会增加我的文档。所以我想删除我写的除第一个之外的所有重复项。幸运的是,这些文档有一个隐含的唯一键 ( match._id
),我应该能够分辨出第一个是什么,因为我使用的是对象 ID。
文件如下所示:
{
_id: "5e8e2d28ca6e660006f263e6"
match : {
_id: 2345
...
}
...
}
所以,现在我有一个聚合,它告诉我哪些元素被复制并将它们存储在一个集合中。肯定有一种更优雅的方式,但我仍在学习。
[{$sort: {"$_id": 1},
{$group: {
_id: "$match._id",
duplicateIds: {$push: "$_id"},
count: {$sum: 1}
}},
{$match: {
count: { $gt: 1 }
}}, {$addFields: {
deletableIds: { $slice: ["$duplicateIds", 1, 1000 ] }
}},
{$out: 'DeleteableIds'}]
现在我不知道如何进一步进行,因为它似乎在聚合中没有“删除”操作,我不想将这些临时数据写入数据库,这样我就可以用它编写删除命令,因为我想一口气删除它们。有没有其他方法可以做到这一点?我还在用 mongodb 学习,感觉有点不知所措:/
解决方案
但是,我认为您在正确的轨道上,要删除您发现的重复项,您可以在集合上使用批量写入。
因此,如果我们假设您的聚合查询将以下内容保存在DeleteableIds
集合中
> db.DeleteableIds.insertMany([
... {deletableIds: [1,2,3,4]},
... {deletableIds: [103,35,12]},
... {deletableIds: [345,311,232,500]}
... ]);
我们现在可以使用它们并编写一个批量写入命令:
const bulkwrite = db.DeleteableIds.find().map(x => ({ deleteMany : { filter: { _id: { $in: x.deletableIds } } } }))
然后我们可以对数据库执行它。
> db.collection1.bulkWrite(bulkwrite)
这将删除所有重复项。
推荐阅读
- python - 在 Keras/TensorFlow 中使用纯 numpy 度量作为度量
- r - curl 包不适用于几个 R 包
- html - php如何计算帖子并将其显示为html中的“(5/1)”
- asp.net - 在 asp.net MVC ZIP 方法中找不到 Ckfinder/Connector
- php - 搜索引擎:Php 从锚标签获取数据
- sql - 从全名中获取名字的逻辑和查询
- acumatica - 动态更改选项卡项的 TEXT
- android - 如何使用 RxJava 延迟加载项目?
- r - 函数中的动态选择表达式
- mysql-8.0 - Mysql 8.0.3:函数 regexp_replace 不存在