restrict documents for mapreduce with mongoid
- by theBernd
I implemented the pearson product correlation via map / reduce / finalize. The missing part is to restrict the documents (representing users) to be processed via a filter query. For a simple query like
mapreduce(mapper, reducer, :finalize => finalizer, :query => { :name => 'Bernd' })
I get this to work.
But my filter criteria is a little bit more complicated: I have one set of preferences which need to have at least one common element and another set of preferences which may not have a common element. In a later step I also want to restrict this to documents (users) within a certain geographical distance.
Currently I have this code working in my map function, but I would prefer to separate this into either query params as supported by mongoid or a javascript function. All my attempts to solve this failed since the code is either ignored or raises an error.
I did a couple of tests. A regular find like
User.where(:name.in => ['Arno', 'Bernd', 'Claudia'])
works and returns
#<Mongoid::Criteria:0x00000101f0ea40
@selector={:name=>{"$in"=>["Arno", "Bernd", "Claudia"]}},
@options={}, @klass=User, @documents=[]>
Trying the same with mapreduce
User.collection.
mapreduce(mapper, reducer, :finalize => finalizer,
:query => { :name.in => ['Arno', 'Bernd', 'Claudia'] })
fails with `serialize': keys must be strings or symbols (TypeError) in bson-1.1.5
The intermediate query parameter looks like this
:query=>{#<Mongoid::Criterion::Complex:0x00000101a209e8 @key=:name,
@operator="in">=>["Arno", "Bernd", "Claudia"]}
and at least @operator looks a bit weird to me. I'm also uncertain if the class name can be omitted.
BTW - I'm using mongodb 1.6.5-x86_64, and the mongoid 2.0.0.beta.20, mongo 1.1.5 and bson 1.1.5 gems on MacOS.
What am I doing wrong?
Thanks in advance.