我从一个巨大的ms excel表格中导入了csv。因此,集合是一个级别。我需要更改一些列,以便它们是2个级别。
例如,这来自csv-import。
{
title: 'House A',
energyElectricity: 55,
energyHeat: 35,
energyCooling:45
}这真是不太好。我希望它采用以下格式:
{
title: 'House A',
energy: {
electricity: 55,
heat: 35,
cooling:45
}
}有没有使用update查询做到这一点的方法呢?
我试过一些东西,但是没有成功。下面是一些伪代码:
db.consumers.update({},{energy.electricity: energyElectricity,energy.heat:energyHeat},{multi:true});
发布于 2014-05-06 11:53:52
除了循环结果之外,实际上没有其他方法可以做到这一点,因为在更新操作期间,目前不可能引用文档的任何现有字段。
所以你的基本结构需要看起来像这样(不管用哪种语言):
db.collection.find({}).forEach(function(doc) {
db.collection.update(
{ "_id": doc._id },
{
"title": doc.title,
"energy": {
"electricity": doc.energyElectricty,
"heat": doc.energyHeat,
"cooling": doc.energyCooling
}
}
);
});您可以使用MongoDB 2.6及更高版本中提供的"bulk updates"更有效地执行此操作:
var batch = [];
var count = 0;
db.collection.find({}).forEach(function(doc) {
batch.push({
"q": { "_id": doc._id },
"u": {
"title": doc.title,
"energy": {
"electricity": doc.energyElectricty,
"heat": doc.energyHeat,
"cooling": doc.energyCooling
}
}
});
count++;
if ( count % 500 == 0 ) {
db.runCommand({ "update": "collection", "updates": batch });
batch = [];
}
});
if ( batch.length > 0 ) {
db.runCommand({ "update": "collection", "updates": batch });
}因此,虽然所有的更新都是通过网络完成的,但实际上每500个(或多少个你觉得舒服的位于16MB BSON限制之下)的项目才会通过网络发送一次。
当然,既然您提到这来自CSV导入,那么如果这是一个合理的选择,您总是可以重塑您的输入并再次导入集合。
https://stackoverflow.com/questions/23480281
复制相似问题