使用$ toLower或$ toUpper更新MongoDB集合

时间:2014-06-24 23:40:46

标签: mongodb database

我想将所有'组织'的'州'字段转换为所有UPPER案例。所以

'Ky'成为'KY' 'tX'变成'TX' 'ca'变为'CA'

为什么这不起作用

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

2 个答案:

答案 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限制范围内。