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

3

我有一个用Node.js编写的简单排名系统,基于MongoDB数据库。每个月系统会创建不同的数据库:1月份为ranking-1,2月份为ranking-2等等。 现在我需要从七月到十二月计算每个用户六个月的总分。

在每个数据库中,我都有一个名为users的集合(collection),其中包含用户模型,看起来像这样:

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查找并统计他过去六个月的得分,并将这些数据导出到另一个数据库或集合中。

十二月份的排名仍在更新,因此我需要每15分钟处理一次此任务。

我知道有map和reduce,但如果我理解得正确,它是在同一数据库的集合上运行的?

是否有一种方法可以合并这些数据,还是我需要重建整个系统?


我所知道的唯一跨不同集合查询数据的方法是使用$lookup运算符。https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/ 好吧,还有graphLookups,但你可能不需要它。如果您发布一些示例数据,我可能能够帮助您。 - dnickless
我最初误读了你的问题,很抱歉。你问的是跨数据库(!)查询,而不是跨集合查询... - dnickless
那么就没有希望了吗? :) - omygoodness
1个回答

2
“使用MongoDB无法跨数据库查询数据。”
“而且,坦率地说,除非你有非常好的理由采用自定义的“按月”分区方式,否则我不建议这样做。因此,如果您可以将系统更改为将所有内容保留在一个数据库中(可能甚至是一个集合),那肯定是正确的方法。”
“但是,我可以想到一堆解决方法:”
  1. 如果您只需要计算一个单一的总和,那么您可以编写一个小应用程序,依次访问所有相关的6个数据库来计算部分总和,然后将6个返回值相加得到最终结果。这应该很简单,可能是最好的方法(除非您可以合并您的数据库)。
  2. 您可以创建一些脚本,调用mongodump(可能使用query参数限制您所需的数据)从相关的数据库/集合中提取信息,并使用mongorestore将它们恢复到公共数据库中(最好甚至是同一目标集合)。然后,您可以对该新集合运行常规查询。
  3. 您可以获取Apache Spark,设置所有数据源,并让Spark完成繁重的工作:https://databricks.com/blog/2015/03/20/using-mongodb-with-spark.html。这会极大地复杂化事情,除非您已经在运行Spark。

我现在会选择选项1,然后需要重建它以将数据存储在同一数据库中。谢谢。 - omygoodness

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接