使用update更改mongodb中对象的架构

使用update更改mongodb中对象的架构,mongodb,Mongodb,我从一个巨大的ms excel表格中导入了csv。因此,集合是一个级别。我需要更改一些列,使其为2级 例如,这来自csv导入 { title: 'House A', energyElectricity: 55, energyHeat: 35, energyCooling:45 } 这不好。我想要以下格式的: { title: 'House A', energy: { electricity: 55, heat: 35, coo

我从一个巨大的ms excel表格中导入了csv。因此,集合是一个级别。我需要更改一些列,使其为2级

例如,这来自csv导入

{
  title: 'House A',
  energyElectricity: 55,
  energyHeat: 35, 
  energyCooling:45
}
这不好。我想要以下格式的:

  {
    title: 'House A',
    energy: {
     electricity: 55,
     heat: 35,
     cooling:45
    }
  }
是否仍然可以通过更新查询执行此操作

我试过一些东西,但运气不好。 这里有一些伪代码:


db.consumers.update({},{energy.electry:energyElectricity,energy.heat:energyHeat},{multi:true})

除了循环结果之外,没有其他方法可以做到这一点,因为在更新操作期间,目前不可能引用文档的任何现有字段

因此,您的基本构造需要看起来像(在任何语言中):

db.collection.find({}).forEach(函数(doc){
db.collection.update(
{u id:doc.\u id},
{
“标题”:文件标题,
“能源”:{
“电”:能源电气博士,
“热”:能量热博士,
“冷却”:文件能源冷却
}
}
);
});
使用MongoDB 2.6及更高版本中提供的组件,您可以更高效地执行此操作:

var batch=[];
var计数=0;
db.collection.find({}).forEach(函数(doc){
批处理推送({
“q”:{“\u id”:doc.\u id},
“u”:{
“标题”:文件标题,
“能源”:{
“电”:能源电气博士,
“热”:能量热博士,
“冷却”:文件能源冷却
}
}
});
计数++;
如果(计数%500==0){
runCommand({“update”:“collection”,“updates”:batch});
批次=[];
}
});
如果(batch.length>0){
runCommand({“update”:“collection”,“updates”:batch});
}
因此,尽管所有更新仍在通过网络进行,但实际上每500个项目(或您觉得在16MB BSON限制下舒适的数量)只通过网络发送一次

当然,由于您提到这来自CSV导入,因此如果结果证明这是一个合理的选项,您可以始终重新调整输入的形状并再次导入集合

看起来像一个复制品