在一个大的集合中为每个文档添加新属性

11

我正在使用mongodb shell,试图为一个大型集合中的每个文档添加新属性。该集合(Listing)已经有一个名为Address的现有属性。我只是想添加一个名为LowerCaseAddress的新属性,它可以用于搜索,这样我就不需要使用大小写不敏感的正则表达式来进行地址匹配,因为这样会很慢。

以下是我在shell中尝试使用的脚本:

for( var c = db.Listing.find(); c.hasNext(); ) {
   var listing = c.next();
   db.Listing.update( { LowerCaseAddress: listing.Address.toLowerCase() });
}

它运行了约6小时,然后我的PC崩溃了。是否有更好的方法向大型集合(~4百万条记录)中的每个文档添加新属性?


看起来你在更新时缺少一些参数 - 你没有设置条件,所以它可能会尝试在每次循环迭代中更新每条记录。(实际上我不确定如果你在更新时没有设置条件,MongoDB的行为会是怎样) - James Avery
这里的Javascript不起作用。看一下Sid Burn的答案。此外,如果您需要更新大量文档,最好分批处理以避免锁定,并在出现故障时拥有进度检查点。 - Gates VP
2个回答

24

你的JavaScript不起作用,但下面的代码有效。但不知道处理4百万条记录需要多长时间。

db.Listing.find().forEach(function(item){
    db.Listing.update({_id: item._id}, {$set: { LowerCaseAddress: item.Address.toLowerCase() }})
})

3
你也可以使用updateMany完成此操作:
try {
 db.<collection>.updateMany( {}, {$set: { LowerCaseAddress: 
 item.Address.toLowerCase() } } );
} catch(e) { 
  print(e);}

2
项目如何不是未定义的? - Matthias Herrmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接