2011-12-20 116 views
0

我正在爲項目選擇數據庫,並且是NoSQL世界的新成員。我不確定是否可以使用NoSQL完成我們要運行的查詢之一。我認爲我的思想只是無法完成查詢。 :)通過外部密鑰對MongoDB分組進行映射/減少

我對map/reduce非常感興趣,這就是爲什麼我試圖推動使用NoSQL數據庫。

我有兩個集合。一個用於設備,一個用於消息。

[{ 
    deviceId: 1, 
    uuid: "30be317c-e586-4448-8fed-1a9481710670" 
}, { 
    deviceId: 1, 
    uuid: "9878917c-e586-4448-8fed-1a9481710670" 
}, { 
    deviceId: 3, 
    uuid: "as2e317c-e586-9878-8fed-1a9481710670" 
}] 

[{ 
    uuid: "30be317c-e586-4448-8fed-1a9481710670", 
    message: "Hello world", 
}, { 
    uuid: "9878917c-e586-4448-8fed-1a9481710670", 
    message: "Bonjour monde", 
}, { 
    uuid: "as2e317c-e586-9878-8fed-1a9481710670", 
    message: "Hola Mundo", 
}] 

現在我想運行的map/reduce命令,並通過他們的deviceId分組的消息。在這個例子中,「Hello World」和「Bonjour Monde」應該使用相同的密鑰進行分組。我想不出在map()方法中將它們分組的方法。

請注意,數據現在存儲在文件中,因此我不會限制在MongoDB中的研究。這是我選擇的第一個,因爲應用程序中的幾乎所有東西都使用JSON。

回答

0

理論上這可以通過在map函數內進行某種連接來實現。 您可以使用「db」對象以及您在shell中執行的所有相關查詢。

db.runCommand({mapReduce: "test", map: function(){var obj = db.test.findOne(); emit(obj._id, 1);}, reduce: function(key, vals){ return Array.sum(vals); }, out: "mrout" }) 

但要注意,這不是明智的理想的性能,如果你還對任何收集介紹分片將無法正常工作。

首選的方法是將deviceId添加到消息文檔中。

1

在MongoDB中,你不能那樣做。

我建議您將deviceId嵌入到消息文檔中。然後你可以按這個字段進行分組。