2011-05-31 89 views
8

使用mongodb shell,我试图向大集合中的每个文档添加一个新属性。集合(Listing)有一个名为Address的现有属性。我只是试图添加一个名为LowerCaseAddress的新属性,它可以用于搜索,以便我不需要使用区分大小写的正则表达式来进行地址匹配,这很慢。将新属性添加到大集合中的每个文档

这里是我试过的外壳使用的脚本:

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

它跑了〜6小时,然后我的电脑死机了。是否有更好的方式为大集合中的每个文档添加新属性(大约400万条记录)?

+0

它看起来就像你在更新缺少一些参数 - 你没有一个标准,所以它可能试图更新每个记录循环的每次迭代。 (如果你没有在更新中设置标准,我实际上并不确定mongo是如何表现的) – 2011-05-31 13:39:27

+0

javascript在这里不起作用。看看Sid Burn的回答。此外,如果您必须更新大量文档,则可能需要批量执行以避免锁定并在出现故障时获取进度检查点。 – 2011-06-01 17:23:25

回答

17

你JavaScript没有工作,但下面的代码工作。但不知道多久需要400万条记录。

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

此查询花了一段时间,但它的工作,谢谢! – Justin 2011-06-02 12:30:28

1

您可以使用updateMany本太:

try { db.<collection>.updateMany({}, {$set: { LowerCaseAddress: item.Address.toLowerCase() } }); } catch(e) { print(e); }

相关问题