我有一個name: String
和version: Integer
某些文件。如何做到這建立的MongoDB查詢(mongomapper)
我需要的是最高版本文件列表名稱。
因此,我認爲我需要在sql中執行相當於group by
的操作,然後再按having
執行每個名稱的max
版本操作。
我不知道從哪裏開始使用mongoDB做到這一點。如果任何人都可以對mongo終端進行查詢,那將是一個很好的開始,但是額外的好處是可以專門爲MongoMapper提供sytnax。
我有一個name: String
和version: Integer
某些文件。如何做到這建立的MongoDB查詢(mongomapper)
我需要的是最高版本文件列表名稱。
因此,我認爲我需要在sql中執行相當於group by
的操作,然後再按having
執行每個名稱的max
版本操作。
我不知道從哪裏開始使用mongoDB做到這一點。如果任何人都可以對mongo終端進行查詢,那將是一個很好的開始,但是額外的好處是可以專門爲MongoMapper提供sytnax。
感謝@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
如果你想用蒙戈DB做1組,檢查Aggregation Framework,它是這項工作的確切的工具!
Here你會發現在聚合框架GROUP BY,等效HAVING,等等。
如果您使用的是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"}}
])
我希望有幫助!
那麼你的想法很好,但這是我的不好,這不是我所需要的 - 我不需要只有實際的最高版本號,我需要**整個**文檔... – MarioDS
在這種情況下,你可以使用$ push操作符將特定字段的所有值收集到如下數組中: Model.collection.aggregate([「$ group」=> {「_id」=>「$ name」, 「max_version 「=> {」$ max「=>」$ version「}, \t」other_fields「=> {」$ push「=>」$ other_field「}} ]) 或者在聚合之後執行查詢並查找與該版本和名稱匹配的文檔。 –
謝謝,但似乎mongomapper不支持此在所有... – MarioDS
在這種情況下,看它是否支持聚合框架,[地圖縮小](HTTP的祖先://文檔.mongodb.org/manual/core/map-reduce /) – Simon
是的,看起來有些選項可以以某種方式做map reduce,但它有點複雜,你需要自己實現大部分。如果這不幸是唯一的解決方案,我會堅持我現在提出的黑客攻擊,因爲我沒有足夠的時間來弄清楚地圖縮小問題。 – MarioDS