MongoDB incremental mapReduce, выберите только новые документы, добавленные после последнего mapReduce

Допустим, у меня есть коллекция документов, которая выглядит следующим образом (упрощенный пример, но он должен показывать схему):

> 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 }

На данный момент все идеально, но я остановился на следующем шаге:

  1. коллекция «данных» постоянно обновляется новыми данными (старые документы остаются без изменений, только вставки, без обновлений)
  2. Я бы хотел мне нравится периодически обновлять коллекцию 'stat', но я не хочу каждый раз запрашивать всю коллекцию 'data', поэтому я предпочитаю запускать инкрементный mapReduce
  3. Может показаться целесообразным просто обновлять коллекцию 'stat' при каждой вставке в ' data 'и не использовать mapReduce, но реальный случай более сложен, чем этот пример, и я хотел бы получать статистику только по запросу.
  4. Для этого я должен иметь возможность запрашивать только те документы, которые были добавлены после моего последнего mapReduce
  5. Насколько я понимаю, я не могу полагаться на свойство ObjectId, просто сохраняю последний, а затем выбираю каждый документ с ObjectId> хранится, потому что ObjectId не совпадает с идентификаторами автоинкремента в базах данных SQL (например, разные сегменты будут создавать разные ObjectIds).
  6. Я могу изменить генератор ObjectId, но не знаю, как это лучше сделать в сегментированной среде

Итак, вопрос:

Можно ли каким-либо образом выбрать только документы, добавленные после последнего mapReduce, для запуска инкрементного mapReduce или Может быть, есть другая стратегия обновления статистических данных по постоянно растущей коллекции?

8
задан Hitosu 17 October 2011 в 13:13
поделиться