2014-06-24 70 views
3

我想将所有'Organization'的'state'字段转换为所有UPPER情况。所以

'肯塔基州' 变成了 'KY' 'TX' 变成 'TX' 'CA' 变为 'CA'

为什么这不起作用

db.organizations.update(state:{ $exists : true }},{$set:{state:{ $toUpper : state }}}, false, true)

回答

3

你必须把toUpperCase()这样的:

"$set": { "state": doc.state.toUpperCase() } } 
+0

感谢吉姆的编辑 – Josie

+0

这个答案很混乱,没有任何意义。什么是“doc”,它来自哪里? @Neil Lunn提供了一个更全面的答案 – IcedDante

1

的您引用的$toLower$toUpper操作符仅与aggregation framework一起使用,并且本身不会像.update()语句那样更改集合中的文档。此外,目前还无法在更新语句中引用现有字段的值以产生新值。

你需要做的是“循环”收集并进行更改:

db.orginizations.find({ "state": { "$exists": true } }).forEach(function(doc) { 
    db.orginizations.update(
     { "_id": doc._id }, 
     { "$set": { "state": doc.state.toUpper() } } 
    ); 
}); 

用MongoDB的2.6或更高版本可以让这个与批量操作API好一点:

var bulk = db.orginizations.initializeOrderedBulkOp(); 
var count = 0; 

db.orginizations.find({ "state": { "$exists": true } }).forEach(function(doc) { 
    bulk.find({ "_id": doc._id }).updateOne({ 
     "$set": { "state": doc.state.toUpperCase() } } 
    ); 
    count++; 
    if (count % 500 == 0) { 
     bulk.execute(); 
     bulk = db.orginizations.initializeOrderedBulkOp(); 
     count = 0; 
    } 
}); 

if (count > 0) 
    bulk.execute(); 

虽然仍然基本上循环结果,但写入操作只能在每500个文档发送一次数据库,或者您选择在该操作的16MB BSON限制下设置的值。

+0

他们没有工作。 MongoDB说'TypeError:doc.state.toUpper不是函数(shell):4' –

+0

@SomPoddar你必须以不同的方式输入内容。 'toUpper()'是一个内置于字符串类型对象的JavaScript。我们已经检查过它存在,所以有可能你的一些数据实际上是'null'或者不是一个字符串?你是否事实上在声明'doc'变量的'.forEach()'循环中运行这个?基本代码已经完成了数千次,因此它可以工作。检查你在做什么。 –

+0

@NeilLunn内置的JavaScript是['String.prototype.toUpperCase()'](https://www.ecma-international.org/ecma-262/6.0/#sec-string.prototype.touppercase)。 – Danziger