合并MongoDB中不同数据库中的集合

时间:2017-12-07 21:26:55

标签: mongodb

我在nodejs中编写了基于mongodb数据库的简单排名系统。对于每个月,系统创建不同的数据库:Janurary的排名-1,2月的排名-2等。 现在我需要将每个用户点数与六个月相加。从7月到12月。

在每个数据库中,我都有一个名为users的集合,其中包含用户模型,如下所示:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var UserSchema = new Schema({
    id: Number,
    name: String,
    points: Number,
    avatar: String,
    rank: String
});

module.exports = mongoose.model('User', UserSchema);

现在我想通过id找到用户,并将他的积分从六个月加起来并将这些数据导出到另一个数据库或集合。

12月的排名仍在更新,所以我需要每15分钟处理一次此任务。

我知道有map和reduce但是如果我理解它很好,那就是在同一个数据库中处理集合?

有没有办法合并这些数据,或者我需要重建整个系统?

1 个答案:

答案 0 :(得分:1)

使用MongoDB无法跨数据库查询数据。

而且,坦率地说,除非你有充分的理由继续使用这种习惯,否则按月和#34;分区,我不建议这样做。因此,如果您可以更改系统以将所有内容保存在一个数据库中(甚至可能是一个集合中),那么这当然是最佳选择。

但是,我可以想到一堆解决方法:

  1. 如果它只是你需要计算的一个总和,那么你可以编写一个小应用程序,只需访问一行中所有相关的6个数据库来计算部分总和,然后将6个返回值加总为最后的结果。这应该是微不足道的,可能是要走的路(除非你可以合并你的数据库)
  2. 您创建了一个调用mongodump的脚本(可能带有query参数,以将数据限制为真正需要的数据)从相关数据库/集合中提取信息并{{ 3}}将它们恢复到一个公共数据库(理想情况下甚至是同一个目标集合)。然后,您可以针对该新集合运行常规查询。
  3. 您可以获得Apache Spark,设置所有数据源并让Spark完成繁重工作:mongorestore。除非你有Spark运行,否则这将使事情变得非常复杂。