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

Som*_*dar 6 database mongodb

我想将所有“组织”的“状态”字段转换为所有大写。所以

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

为什么这不起作用

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

Nei*_*unn 5

您引用的$toLowerand$toUpper运算符仅用于聚合框架,并且其本身不会像.update()语句那样更改集合中的文档。此外,目前无法在更新语句中引用现有字段的值来生成新值。

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

db.organizations.find({ "state": { "$exists": true } }).forEach(function(doc) {
    db.organizations.update(
        { "_id": doc._id },
        { "$set": { "state": doc.state.toUpperCase() } }
    );
});
Run Code Online (Sandbox Code Playgroud)

使用 MongoDB 2.6 或更高版本,您可以使用批量操作 API 使这更好一点:

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

db.organizations.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.organizations.initializeOrderedBulkOp();
        count = 0;
    }
});

if ( count > 0 )
    bulk.execute();
Run Code Online (Sandbox Code Playgroud)

虽然仍然基本上循环结果,但写入仅每 500 个文档或您选择设置的任何内容发送到数据库一次,保持在 16MB BSON 限制下进行操作。


小智 2

你必须toUpperCase()这样写:

"$set": { "state": doc.state.toUpperCase() } }
Run Code Online (Sandbox Code Playgroud)

  • 这个答案令人困惑并且没有真正的意义。什么是“doc”?它来自哪里?@Neil Lunn 提供了更全面的答案 (10认同)