2011-04-19 9 views
5

tengo documentos con el campo que contiene xyz¿Cómo puedo stringificar un objeto BSON dentro de una función de mapa MongoDB?

{ term: "puppies", page: { skip: 1, per_page: 20 } } // not useful as a composite key... 
{ page: { skip: 1, per_page: 20 }, term: "puppies" } // different order, same contents 

En aras de la determinación de los valores "superiores" en xyz, que desea asignar a todos a algo así como

emit('term="puppies",page={ skip: 1, per_page: 20 }', 1); // composite key 

pero no puedo conseguir los objetos incrustados en unas cuerdas significativas:

emit('term="puppies",page=[object bson_object]', 1); // not useful 

Cualquier sugerencia para una función en vez de usar toString()?

# return the top <num> values of <field> based on a query <selector> 
# 
# example: top(10, :xyz, {}, {}) 
def top(num, field, selector, opts = {}) 
    m = ::BSON::Code.new <<-EOS 
    function() { 

     var keys = []; 

     for (var key in this.#{field}) { 
     keys.push(key); 
     } 

     keys.sort(); 

     var sortedKeyValuePairs = []; 

     for (i in keys) { 
     var key = keys[i]; 
     var value = this.#{field}[key]; 

     if (value.constructor.name == 'String') { 
      var stringifiedValue = value; 
     } else if (value.constructor.name == 'bson_object') { 
      // this just says "[object bson_object]" which is not useful 
      var stringifiedValue = value.toString(); 
     } else { 
      var stringifiedValue = value.toString(); 
     } 

     sortedKeyValuePairs.push([key, stringifiedValue].join('=')); 
     } 

     // hopefully we'll end up with something like 
     // emit("term=puppies,page={skip:1, per_page:20}") 
     // instead of 
     // emit("term=puppies,page=[object bson_object]") 
     emit(sortedKeyValuePairs.join(','), 1); 
    } 
    EOS 
    r = ::BSON::Code.new <<-EOS 
    function(k, vals) { 
     var sum=0; 
     for (var i in vals) sum += vals[i]; 
     return sum; 
    } 
    EOS 
    docs = [] 
    collection.map_reduce(m, r, opts.merge(:query => selector)).find({}, :limit => num, :sort => [['value', ::Mongo::DESCENDING]]).each do |doc| 
    docs.push doc 
    end 
    docs 
end 
+0

Yendo hasta el primer ejemplo de código. ¿Por qué no es útil como una clave compuesta? MongoDB es perfectamente capaz de tener objetos BSON como _id (o claves). –

Respuesta

1

toSource method va a hacer el trabajo, pero también añade entre paréntesis. para un documento limpio uso:

value.toSource().substring(1, value.toSource().length - 1) 
Cuestiones relacionadas