ОК, это интересный вопрос, потому что вкратце: вам придется повторять и запускать javascript для каждого элемента .
Часть, где это становится "аккуратным", заключается в том, что это не очень отличается от того, что должно было бы сделать решение SQL. Я имею в виду, вы в основном присоединяете таблицу к себе, где x.1=x.1
и y.1=y.2
. Даже если реляционная БД может справиться с таким зверем, она определенно не будет быстрой с миллионами записей.
Так что правда в том, что вы делаете это правильно. Вот дополнительные детали, которые я бы использовал, чтобы сделать это чище.
- Убедитесь, что у вас есть индекс по имени / метке времени.
- Выполнить
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', которое у вас будет.
Честно говоря, если вы работаете только один раз в день, вполне вероятно, что скорость будет просто отличной, особенно если вы работаете только на новых записях. Просто предположим, что это займет несколько минут.