是否可以使用集合B中的数据更新集合A?
背景 这样做的目的是避免mongodb缺乏适当的原子性。 我正在循环一些日志数据以生成数据聚合,并希望知道数据与要求放入的内容相匹配。而不是执行two phase commit,我想生成批量写入保持集合。收集完成后(例如,在读取10000条记录或整个文件之后),将数据库中的文档计数与应用程序生成的计数进行比较,如果匹配,则使用临时集合更新大集合。在下一次导入开始时清除临时集合。这样,如果进程在任何时间中断,则在更新阶段发生的可能性会更小,并且临时收集群体中的任何错误都将通过擦除临时数据自动修复,并且该进程在下次启动时重新启动。 / p>
是否可以使用临时集合中的数据更新主集合?这种更新是否明显快于应用程序的个别更新?
更新
两个集合中的数据看起来都像这样(下图)。我希望合并基于event
和month
找到匹配文档的记录,或者如果不存在则创建新文档。然后它会采用每日数字并递增它们。我们的想法是,每次读取记录时,更新临时集合中计数的过程会更新一次,因此每日计数为一次写入。完成批处理后,我想使用单个mongodb命令使用临时集合的内容更新主集合。
{
"event": "abc",
"month": "2012-04",
"daily": {
"1": 82,
"2": 6,
"3": 12,
"4": 23,
"5": 62,
...
}
}
答案 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。