Поиск изменений в базе данных MongoDB - PullRequest
1 голос
/ 07 июня 2010

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

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

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 для каждого запуска скрипта? Это сделает это быстрее / более организованным? Есть ли лучшая схема, которую можно использовать?

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

1 Ответ

1 голос
/ 10 июня 2010

ОК, это интересный вопрос, потому что вкратце: вам придется повторять и запускать javascript для каждого элемента .

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...