A : 1 ,
B: 1,
}},
{ $sort: {_id: 1}},
{
$group: {
_id: {a:"$A", b: "$B"},
id: {$first: "$_id"},
count: { $sum: 1 }
}
},
{
$match: {
count: { $gt: 1 }
}
}
]).forEach(function (record) {
db.temp.remove({
_id: {
$ne: record.id
},
A: record._id.a,
B: record._id.b
});
});
как то можно это выполнить быстрее?) в коллекции 25М документов. Индекс _id_1_A_1_B_1 есть. больше часа уже работает, конца и края не видно)
Сколько дублей?
4831258
// Создание индекса для полей A и B в коллекции temp, чтобы ускорить сортировку и группировку db.temp.createIndex({ A: 1, B: 1 }); // Агрегация с использованием оператора $group для подсчета количества записей с одинаковыми значениями A и B const aggregationPipeline = [ { $group: { _id: { a: "$A", b: "$B" }, ids: { $push: "$_id" }, // Сохраняем все _id записей для каждой группы count: { $sum: 1 }, }, }, { $match: { count: { $gt: 1 }, }, }, ]; // Получение результатов агрегации const duplicateRecords = db.temp.aggregate(aggregationPipeline).toArray(); // Удаление дубликатов на основе найденных записей duplicateRecords.forEach(function (group) { const idsToRemove = group.ids.slice(1); // Оставляем только _id для удаления, исключая первый db.temp.remove({ _id: { $in: idsToRemove } }); }); // Удаление временного индекса после обработки db.temp.dropIndex({ A: 1, B: 1 });
Форич в ноде условно однопоточный, поэтому на таком количестве доков все растянулось. Ускорить можно было бы с авайтом
Зачем сортировать на _id если там уже дефолтная сортировка
что значит условный
То что если явно в авайт/промис не обернуть и не добавить ожидание завершения всех запросов, то форич будет итеративно идти по массиву
ну да, я увидел "форич" и "условно однопоточный" хотел узнать что имели в виду
Обсуждают сегодня