2011-04-19 14 views
5

Ben xyz "üst" değerlerinin tespit edilmesi uğrunaMongoDB harita işlevinin içindeki BSON nesnesini nasıl dizebilirim?

{ 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 

içeren alanda xyz ile belgeleri var,

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

gibi bir şey için hepsini eşlemek istediğiniz ama yapamıyorum anlamlı dizeleri içine gömülü nesneleri almak:

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

Herhangi önerilerini kullanmak yerinebir işlev için?

# 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

İlk kod örneğine kadar ilerlemek. Bu neden bir bileşik anahtar olarak kullanışlı değil? MongoDB, BSID nesnelerini _id (veya anahtarlar) olarak mükemmel bir şekilde kullanabilir. –

cevap

1

toSource method (üzgünüm, işe ediyorum onaylamak için ATM denemek olamaz), ama aynı zamanda parantez ekler. Temiz bir belge kullanımı için :

value.toSource().substring(1, value.toSource().length - 1) 
İlgili konular