我有一个具有重复记录的集合。我正在使用mongodb 4.0。如何从整个集合中删除重复的记录?
正在使用以下结构插入记录 {item:“ journal”,数量:25,大小:15,状态:“ A”}
我需要做的是为一个文档创建唯一记录。
答案 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')
中组合。
聚合管道使用量的预计:
db.theCollectionWithoutDuplicates.renameCollection('theCollection', true)
执行聚合管道,接收要执行的聚合阶段列表db.theCollection.aggregate([])
阶段按指定为后续$group
字段的字段分组文档_id
阶段更改字段名称,展平$project
产生的嵌套_id
子文档$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 })
})