通过外部键对MongoDB分组进行映射/缩小

时间:2011-12-20 18:03:33

标签: mongodb relational-database nosql

我正在为项目选择一个数据库,并且是NoSQL世界的新手。我不确定我们将运行的查询之一是否可以使用NoSQL完成。我认为我的想法是无法进行查询。 :)

我对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。

2 个答案:

答案 0 :(得分:1)

在MongoDB中你不能这样做。

我建议您将deviceId嵌入到邮件文档中。然后你就可以按此字段进行分组。

答案 1 :(得分: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添加到消息文档中。