Допустим, у меня есть коллекция с документами, которая выглядит следующим образом (просто упрощенный пример, но должна показать схему):
> db.data.find()
{ "_id" : ObjectId("4e9c1f27aa3dd60ee98282cf"), "type" : "A", "value" : 11 }
{ "_id" : ObjectId("4e9c1f33aa3dd60ee98282d0"), "type" : "A", "value" : 58 }
{ "_id" : ObjectId("4e9c1f40aa3dd60ee98282d1"), "type" : "B", "value" : 37 }
{ "_id" : ObjectId("4e9c1f50aa3dd60ee98282d2"), "type" : "B", "value" : 1 }
{ "_id" : ObjectId("4e9c1f56aa3dd60ee98282d3"), "type" : "A", "value" : 85 }
{ "_id" : ObjectId("4e9c1f5daa3dd60ee98282d4"), "type" : "B", "value" : 12 }
Теперь мне нужно собрать статистику по этой коллекции. Например:
db.data.mapReduce(function(){
emit(this.type,this.value);
},function(key,values){
var total = 0;
for(i in values) {total+=values[i]};
return total;
},
{out:'stat'})
будет собирать итоги в коллекции 'stat'.
> db.stat.find()
{ "_id" : "A", "value" : 154 }
{ "_id" : "B", "value" : 50 }
На данный момент все идеально, но я застрял на следующем ходу:
- Коллекция 'data' постоянно обновляется новыми данными (старые документы остаются без изменений, только вставки, без обновлений)
- Я хотел бы периодически обновлять коллекцию 'stat', но не хочу каждый раз запрашивать всю коллекцию 'data', поэтому я решил запустить инкрементную mapReduce
- Может показаться целесообразным просто обновлять коллекцию stat для каждой вставки в коллекции данных и не использовать mapReduce, но реальный случай более сложный, чем в этом примере, и я хотел бы получать статистику только по запросу.
- Для этого я должен иметь возможность запрашивать только те документы, которые были добавлены после моего последнего mapReduce
- Насколько я понимаю, я не могу полагаться на свойство ObjectId, просто сохраните последний, а затем выберите каждый документ с сохраненным ObjectId>, поскольку ObjectId не совпадает с идентификаторами автоинкремента в базах данных SQL (например, разные шарды будут создавать разные ObjectId).
- Я могу изменить генератор ObjectId, но не уверен, как это сделать лучше в защищенной среде
Так что вопрос:
Можно ли выбрать только документы, добавленные после последнего mapReduce для запуска пошагового mapReduce, или, может быть, существует другая стратегия обновления статистических данных для постоянно растущей коллекции?