Я разрабатываю базу данных 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 работает один раз в день, поэтому я не буду запускать ограничение пространства имен в ближайшее время.
Хорошо, это аккуратный вопрос b/c, в основном это короткий текст: вам придется перебирать и запускать javascript над каждым элементом.
Часть, где это становится "аккуратным", заключается в том, что это не совсем отличается от того, что должно было бы сделать SQL-решение. Я имею в виду, что вы в основном присоединяетесь к таблице себе, где x.1=x.1
и y.1=y.2
. Даже если реляционная БД может обрабатывать такого зверя, он определенно не будет быстрым с миллионами записей.
Итак, правда, вы делаете это правильно. Вот дополнительные подробности, которые я хотел бы использовать для создания этого чище.
db.mycollection.find().foreach()
через набор данных.db.mycollection.find({flag:{$exists:false}}).foreach()
db.eval()
для ускорения работы.Причиной индекса "Name/Timestamp" является то, что вы будете искать каждого "преемника" по "Name/Timestamp", поэтому вы хотите быть быстрым здесь.
Причиной для "обработанного" флага является то, что вам никогда не придется повторно запускать тот же элемент. Если задана метка времени "n", вы найдете "n + 1", а затем только "n + 1".
Честно говоря, если вы работаете только один раз/день, вполне вероятно, что скорость будет прекрасной, особенно если вы работаете только с новыми записями. Предположим, что это займет несколько минут.