我正在为项目选择一个数据库,并且是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。
答案 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添加到消息文档中。