Я использую Perl v5.12 с пакетом MongoDB v0.45.
Я хотел бы запустить задание MapReduce, чтобы создать новую коллекцию, а затем создам курсор для дальнейшего использования.
Другое мое желание - чтобы эта работа выполнялась на реплике, а не на мастере.
Как определено в perl doc, задания MapReduce должны выполняться с использованием метода run_command
.
Когда я выполняю Perl-скрипт, я получаю:
Mongo error: not master at perlib/Connections.pm line 63.
После прочтения документации MongoDB по CPAN, кажется, есть только способ, позволяющий курсорам читать из реплик. Так что этот метод не применим к вызовам run_command()
.
Вот мой код:
sub get_data {
my $self = shift;
my $dbh = shift;
my $collection_h = shift;
my $since_time = $self->get_date_time(shift);
my $loop_limit = $self->get_data_limit(shift);
my %data = ();
my $ctr = 0;
my $temp_collection='temp_collection';
my $ids = $dbh->run_command([
"mapreduce" => $collection_h->{'name'}
,"map" => _get_map()
,"reduce" => _get_reduce()
,"query" => {'to.id' => {'$exists'=>'true'}, 'updatedDate' => { '$gte' => $since_time }}
,"out" => $temp_collection
]);
die ("Mongo error: $ids") unless ref($ids) eq 'HASH';
# next we create a cursor to this new collection
my $cfs_h = $dbh->$temp_collection;
my $id_cursor = $cfs_h->find()->limit($loop_limit);
$id_cursor->slave_okay(1);
$id_cursor->immortal(1);
...
}
sub _get_map {
return "function() {emit(this.to.id, 1);}";
}
sub _get_reduce {
return "function(k,vals) {return 1;}"
}
Кто-нибудь сталкивался с этой проблемой при попытке использовать MapReduce на реплике?
Вы сделали это успешно?
Если да, не могли бы вы поделиться, как вы это сделали.