通过外部键映射/减少MongoDB分组

通过外部键映射/减少MongoDB分组,mongodb,relational-database,nosql,Mongodb,Relational Database,Nosql,我正在为一个项目选择一个数据库,并且是NoSQL世界的新手。我不确定我们将运行的查询是否可以使用NoSQL完成。我想我的大脑还不能做这个查询 我对map/reduce非常感兴趣,这就是我尝试使用NoSQL数据库的原因 我有两个收藏。一个用于设备,一个用于消息 [{ deviceId: 1, uuid: "30be317c-e586-4448-8fed-1a9481710670" }, { deviceId: 1, uuid: "9878917c-e586-4448-8fed-1a

我正在为一个项目选择一个数据库,并且是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

在MongoDB中,你不能这么做


我建议您将
deviceId
嵌入到消息文档中。然后你就可以根据这个字段进行分组。

理论上,这可以通过在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添加到消息文档中