使用更新合并集合

时间:2016-04-06 19:32:01

标签: mongodb

是否可以使用集合B中的数据更新集合A?

背景 这样做的目的是避免mo​​ngodb缺乏适当的原子性。 我正在循环一些日志数据以生成数据聚合,并希望知道数据与要求放入的内容相匹配。而不是执行two phase commit,我想生成批量写入保持集合。收集完成后(例如,在读取10000条记录或整个文件之后),将数据库中的文档计数与应用程序生成的计数进行比较,如果匹配,则使用临时集合更新大集合。在下一次导入开始时清除临时集合。这样,如果进程在任何时间中断,则在更新阶段发生的可能性会更小,并且临时收集群体中的任何错误都将通过擦除临时数据自动修复,并且该进程在下次启动时重新启动。 / p>

是否可以使用临时集合中的数据更新主集合?这种更新是否明显快于应用程序的个别更新?

更新 两个集合中的数据看起来都像这样(下图)。我希望合并基于eventmonth找到匹配文档的记录,或者如果不存在则创建新文档。然后它会采用每日数字并递增它们。我们的想法是,每次读取记录时,更新临时集合中计数的过程会更新一次,因此每日计数为一次写入。完成批处理后,我想使用单个mongodb命令使用临时集合的内容更新主集合。

{
    "event": "abc",
    "month": "2012-04",
    "daily": {
      "1": 82,
      "2": 6,
      "3": 12,
      "4": 23,
      "5": 62,
      ...
    }
}

1 个答案:

答案 0 :(得分:2)

这是从菜鸟那里扔出来的。

从我的问题中得到的信息。 我会用一个JS循环来解决这个问题。

这是可以用作来源的东西。

db.collection_a.find().batchSize(10000).forEach(function(doc){

    result = db.collection_b.findOne({'column_b': doc['column_a']});

    if (result != null){
        db.collection_a.update({'_id': doc['_id']},{
           $set:{
            'new_column_a': result['column_b']
        }
    })}

    else {
    print('Not found ' + doc['column_a'])
}
});
可以在第一个函数中更改

batchsize

  • 第一个函数查找每个数据集。
  • 第二个函数查找每个集合中的匹配数据集。

然后 _id 将会更新。 最后,新列被添加到collection_a中。数据来自集合b。