2013-05-17 20 views
0

我有一個name: Stringversion: Integer某些文件。如何做到這建立的MongoDB查詢(mongomapper)

我需要的是最高版本文件列表名稱

因此,我認爲我需要在sql中執行相當於group by的操作,然後再按having執行每個名稱的max版本操作。

我不知道從哪裏開始使用mongoDB做到這一點。如果任何人都可以對mongo終端進行查詢,那將是一個很好的開始,但是額外的好處是可以專門爲MongoMapper提供sytnax。

回答

0

感謝@Simon我看看Map Reduce和MongoMapper。我認爲它可能並不完美,但它做我想做的事情。下面是執行:

class ChildTemplate 
    ... 
    key :name, String 
    key :version, Integer, :default => 1 

    ... 

    private 
    def self.map 
    <<-JS 
    function() { 
     emit(this.name, this); 
    } 
    JS 
    end 

    private 
    def self.reduce 
    <<-JS 
    function(key, values) { 
     var res = values[0]; 
     for(var i=1; i<values.length; i++) 
     { 
     if(values[i].version > res.version) 
     { 
      res = values[i]; 
     } 
     } 
     return res; 
    }   
end 

def self.latest_versions(opts = {}) 
    results = [] 
    opts[:out] = "ct_latest_versions" 
    ChildTemplate.collection.map_reduce(map, reduce, opts).find().each do |map_hash| 
    results << map_hash["value"] 
    end 
    return results 
end 
1

如果你想用蒙戈DB做1組,檢查Aggregation Framework,它是這項工作的確切的工具!

Here你會發現在聚合框架GROUP BY,等效HAVING,等等。

+0

謝謝,但似乎mongomapper不支持此在所有... – MarioDS

+0

在這種情況下,看它是否支持聚合框架,[地圖縮小](HTTP的祖先://文檔.mongodb.org/manual/core/map-reduce /) – Simon

+0

是的,看起來有些選項可以以某種方式做map reduce,但它有點複雜,你需要自己實現大部分。如果這不幸是唯一的解決方案,我會堅持我現在提出的黑客攻擊,因爲我沒有足夠的時間來弄清楚地圖縮小問題。 – MarioDS

3

如果您使用的是Mongodb 2.2+版本,則可以通過使用帶有組管道運算符的聚合框架來執行查詢。

的文檔是在這裏:http://docs.mongodb.org/manual/reference/aggregation/

MongoMapper不具有聚合框架幫手,但你可以直接使用Ruby驅動程序(驅動程序版本1.7.0+有一個總的輔助方法)。你將不得不得到一個Mongo :: Collection實例,並調用它的聚合方法。例如:

Model.collection.aggregate(["$group" => 
    {"_id" => "$name", 
    "max_version" => {"$max" => "$version"}} 
    ]) 

我希望有幫助!

+0

那麼你的想法很好,但這是我的不好,這不是我所需要的 - 我不需要只有實際的最高版本號,我需要**整個**文檔... – MarioDS

+1

在這種情況下,你可以使用$ push操作符將特定字段的所有值收集到如下數組中: Model.collection.aggregate([「$ group」=> {「_id」=>「$ name」, 「max_version 「=> {」$ max「=>」$ version「}, \t」other_fields「=> {」$ push「=>」$ other_field「}} ]) 或者在聚合之後執行查詢並查找與該版本和名稱匹配的文檔。 –