Db.Subscribers.Aggregate([ Db.Temp.Aggregate([ { $project : {

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 есть. больше часа уже работает, конца и края не видно)

8 ответов

10 просмотров

Сколько дублей?

Thunder-Bird Автор вопроса

// Создание индекса для полей 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 });

Thunder Bird
4831258

Форич в ноде условно однопоточный, поэтому на таком количестве доков все растянулось. Ускорить можно было бы с авайтом

Зачем сортировать на _id если там уже дефолтная сортировка

Nikita
что значит условный

То что если явно в авайт/промис не обернуть и не добавить ожидание завершения всех запросов, то форич будет итеративно идти по массиву

Nick
То что если явно в авайт/промис не обернуть и не д...

ну да, я увидел "форич" и "условно однопоточный" хотел узнать что имели в виду

Похожие вопросы

Обсуждают сегодня

Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
Коллеги, может знает кто, можно ли цвет бейджа счётчика в BackendMenu менять без бубнов?
Alex Blaze
3
Привет!) Кто как юзает переменные в строках?) Чисто ради интереса Вот так: echo "У меня {$bananasAmount} бананов"; Или вот так: echo "У меня ${bananasAmount} бананов";
Виталий
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
разработчик ботов скидывает портфолио, боты которые он уже создал. А вот как узнать что это именно он их создал?
Gosudar
4
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Карта сайта