這不是「加入」的不同文件;它是一個文件中的一個操作,並且可以在MongoDB中完成。
You have a SQL TABLE "data" like this:
JobID TEXT,
package TEXT
到這些信息存儲在MongoDB中,最好的辦法將是一個集合稱爲「數據」,包含每個作業ID一個文檔,包含封裝陣列:
{
_id: <JobID>,
packages: [
"packageA",
"packageB",
....
]
}
[注:你也可以實現你的數據表只能作爲MongoDB中的一個文檔,包含一個包含每個軟件包數組的作業數組。這是不推薦的,因爲你可能會遇到16MB的文檔大小限制,並且嵌套數組還沒有被不同的查詢很好地支持 - 如果你想將數據用於其他目的,那麼]
現在,如何獲取像這樣的結果?
{ pair: [ "packageA", "packageB" ], count: 20 },
{ pair: [ "packageA", "packageC" ], count: 11 },
...
由於沒有內置的「交叉連接」 MongoDB中兩個數組的,你得出來的MapReduce的()的地圖功能項目,分別發出對包作爲重點:
mapf = function() {
that = this;
this.packages.forEach(function(p1) {
that.packages.forEach(function(p2) {
if (p1 < p2) {
key = { "pair": [ p1, p2 ] };
emit(key, 1);
};
});
});
};
[注:這可能是最優化,如果封裝陣列,分類]
的降低作用無非是爲每個按鍵計數器總結以上:
reducef = function(key, values) {
count = 0;
values.forEach(function(value) { count += value });
return count;
};
所以,在這個例子中採集:
> db.data.find()
{ "_id" : "Job01", "packages" : [ "pA", "pB", "pC" ] }
{ "_id" : "Job02", "packages" : [ "pA", "pC" ] }
{ "_id" : "Job03", "packages" : [ "pA", "pB", "pD", "pE" ] }
we get the following result:
> db.data.mapReduce(
... mapf,
... reducef,
... { out: 'pairs' }
...);
{
"result" : "pairs",
"timeMillis" : 443,
"counts" : {
"input" : 3,
"emit" : 10,
"reduce" : 2,
"output" : 8
},
"ok" : 1,
}
> db.pairs.find()
{ "_id" : { "pair" : [ "pA", "pB" ] }, "value" : 2 }
{ "_id" : { "pair" : [ "pA", "pC" ] }, "value" : 2 }
{ "_id" : { "pair" : [ "pA", "pD" ] }, "value" : 1 }
{ "_id" : { "pair" : [ "pA", "pE" ] }, "value" : 1 }
{ "_id" : { "pair" : [ "pB", "pC" ] }, "value" : 1 }
{ "_id" : { "pair" : [ "pB", "pD" ] }, "value" : 1 }
{ "_id" : { "pair" : [ "pB", "pE" ] }, "value" : 1 }
{ "_id" : { "pair" : [ "pD", "pE" ] }, "value" : 1 }
欲瞭解更多信息,MapReduce的諮詢:http://docs.mongodb.org/manual/reference/method/db.collection.mapReduce/和http://docs.mongodb.org/manual/applications/map-reduce/
你嘗試過什麼?你看過[這個](http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/)頁面的靈感? – WiredPrairie 2013-03-08 02:52:30