我想将所有'Organization'的'state'字段转换为所有UPPER情况。所以
'肯塔基州' 变成了 'KY' 'TX' 变成 'TX' 'CA' 变为 'CA'
为什么这不起作用
db.organizations.update(state:{ $exists : true }},{$set:{state:{ $toUpper : state }}}, false, true)
我想将所有'Organization'的'state'字段转换为所有UPPER情况。所以
'肯塔基州' 变成了 'KY' 'TX' 变成 'TX' 'CA' 变为 'CA'
为什么这不起作用
db.organizations.update(state:{ $exists : true }},{$set:{state:{ $toUpper : state }}}, false, true)
你必须把toUpperCase()
这样的:
"$set": { "state": doc.state.toUpperCase() } }
的您引用的$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限制下设置的值。
他们没有工作。 MongoDB说'TypeError:doc.state.toUpper不是函数(shell):4' –
@SomPoddar你必须以不同的方式输入内容。 'toUpper()'是一个内置于字符串类型对象的JavaScript。我们已经检查过它存在,所以有可能你的一些数据实际上是'null'或者不是一个字符串?你是否事实上在声明'doc'变量的'.forEach()'循环中运行这个?基本代码已经完成了数千次,因此它可以工作。检查你在做什么。 –
@NeilLunn内置的JavaScript是['String.prototype.toUpperCase()'](https://www.ecma-international.org/ecma-262/6.0/#sec-string.prototype.touppercase)。 – Danziger
感谢吉姆的编辑 – Josie
这个答案很混乱,没有任何意义。什么是“doc”,它来自哪里? @Neil Lunn提供了一个更全面的答案 – IcedDante