Nano Hash - криптовалюты, майнинг, программирование

MongoDB отбрасывает дубликаты с помощью sureIndex, но сохраняет последнюю запись, а не первую

У меня проблема с дублированием.

Я пытаюсь удалить все дубликаты из коллекции MongoDB, проблема в том, что я хочу сохранить не первую запись, а последнюю.

Вот как я сохраняю первую запись:

db.CUDB.ensureIndex( { CUid: 1 }, { unique: true, dropDups: true } )

Но я хотел бы иметь возможность застраховать индекс в обратном порядке и сохранить последнюю добавленную запись вместо первой.

Как это сделать проще всего?

18.02.2015

Ответы:


1

ensureIndex не дает возможности сделать это. Также не сообщается, какие значения будут удалены.

В вашем случае я бы попытался сделать следующее (что, безусловно, будет медленнее, чем обеспечить индекс). Я также предполагаю, что у вас есть какое-то поле (в моем случае created_at), основанное на том, что вы решаете, является ли один документ старше другого):

var checked = {}; // basically a hash, which ensures O(1) lookup
db.coll.find().sort({created_at: -1}).forEach(function(o){
  if (o['CUid'] in checked){
    db.coll.remove({_id: o['_id']});
  } else {
    checked[o['CUid']] = 1;
  }
})

Таким образом, в основном мы перебираем все ваши документы в обратном порядке (самый новый первый) и проверяем, видели ли мы уже ваше поле CUid. Если у нас его нет, то оставляем этот документ как есть и отмечаем как просмотренный. Если позже мы увидим какой-либо другой документ с таким же CUid, мы можем его удалить.

В итоге вы получите одно полное сканирование вашей коллекции и N дополнительных вызовов базы данных для каждого дублированного элемента.

Обратная сортировка гарантирует, что будет сохранен самый новый элемент.

P.S.

Остерегайтесь ошибок в приведенном выше коде; Я только доказал, что это правильно, не пробовал.

и скажи мне, как это происходит.

P.P.S. если вы все еще не можете отсортировать все коллекции в монго, я бы попытался сделать это на прикладном уровне. По сути, вы находите все свои коллекции, сортируете их по любому языку, который хотите, а затем выполняете ту же логику и там.

18.02.2015
  • Выглядит круто, но у меня небольшая проблема с памятью: Runner error: Overflow sort stage buffered data usage of 33578371 bytes exceeds internal limit of 33554432 bytes Кроме того, в базе данных около 300 тысяч записей, а ее размер составляет около 1,6 ГБ :-s 18.02.2015
  • @Eek, это большая проблема :-). Это означает, что не хватает памяти для сортировки всей вашей коллекции. Что может помочь, так это создать индекс на вашем аналоге created_at, потому что без индекса вы не можете использовать более 64 МБ (что для меня удивительно, так это то, что в вашем случае он отключается после 32 МБ) 18.02.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..