Поиск изменений в базе данных MongoDB

1

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

Мне нужно выяснить, какие имена вносились в поле данных между script run, а какие нет. В псевдокоде

if(data[name][timestamp]==data[name][timestamp+1]) //data has not changed
store data in collection 1
else //data has changed between script runs for this name
store data in collection 2

Есть ли запрос, который может сделать это без итерации и запуска javascript над каждым элементом в коллекции? Есть миллионы документов, поэтому это будет довольно медленно.

Должен ли я создать новую коллекцию с именем timestamp для каждого запуска script? Станет ли это быстрее/более организованным? Есть ли лучшая схема, которая может быть использована?

script работает один раз в день, поэтому я не буду запускать ограничение пространства имен в ближайшее время.

Теги:
database-design

1 ответ

1

Хорошо, это аккуратный вопрос b/c, в основном это короткий текст: вам придется перебирать и запускать javascript над каждым элементом.

Часть, где это становится "аккуратным", заключается в том, что это не совсем отличается от того, что должно было бы сделать SQL-решение. Я имею в виду, что вы в основном присоединяетесь к таблице себе, где x.1=x.1 и y.1=y.2. Даже если реляционная БД может обрабатывать такого зверя, он определенно не будет быстрым с миллионами записей.

Итак, правда, вы делаете это правильно. Вот дополнительные подробности, которые я хотел бы использовать для создания этого чище.

  • Убедитесь, что у вас есть указатель на Name/Timestamp.
  • Запустите a db.mycollection.find().foreach() через набор данных.
  • Представьте, что вы собираетесь a) выполнить сравнение. b) Сохранить соответствующим образом. c) Обновить флаг, указывающий, что эта запись была обработана.
  • В будущих загрузках вы должны будете добавить запрос к своей находке. db.mycollection.find({flag:{$exists:false}}).foreach()
  • Используйте db.eval() для ускорения работы.

Причиной индекса "Name/Timestamp" является то, что вы будете искать каждого "преемника" по "Name/Timestamp", поэтому вы хотите быть быстрым здесь.

Причиной для "обработанного" флага является то, что вам никогда не придется повторно запускать тот же элемент. Если задана метка времени "n", вы найдете "n + 1", а затем только "n + 1".

Честно говоря, если вы работаете только один раз/день, вполне вероятно, что скорость будет прекрасной, особенно если вы работаете только с новыми записями. Предположим, что это займет несколько минут.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню