我想将所有'组织'的'州'字段转换为所有UPPER案例。所以
'Ky'成为'KY' 'tX'变成'TX' 'ca'变为'CA'
为什么这不起作用
db.organizations.update(state:{ $exists : true }},{$set:{state:{ $toUpper : state }}}, false, true)
答案 0 :(得分:3)
你必须像这样放toUpperCase()
:
"$set": { "state": doc.state.toUpperCase() } }
答案 1 :(得分:2)
您引用的$toLower
和$toUpper
运算符仅用于aggregation framework,并且它本身不会像.update()
语句那样更改集合中的文档。此外,目前无法在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限制范围内。