2011-12-20 115 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嵌入到消息文档中。然后你可以按这个字段进行分组。