使用update更改mongodb中对象的架构
我从一个巨大的ms excel表格中导入了csv。因此,集合是一个级别。我需要更改一些列,使其为2级 例如,这来自csv导入使用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
{
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导入,因此如果结果证明这是一个合理的选项,您可以始终重新调整输入的形状并再次导入集合 看起来像一个复制品