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

9
我希望将所有“组织”的“状态”字段转换为大写。 因此,'Ky'变为'KY' 'tX'变为'TX' 'ca'变为'CA'。以下是为什么这个命令不起作用的原因: db.organizations.update(state:{ $exists : true }},{$set:{state:{ $toUpper : state }}}, false, true)
3个回答

8
您所提到的$toLower$toUpper操作符仅适用于聚合框架,不能像.update()语句一样直接更改集合中的文档。此外,目前不可能在更新语句中引用现有字段的值以生成新值。
您需要做的是“循环”遍历集合并进行更改。
db.organizations.find({ "state": { "$exists": true } }).forEach(function(doc) {
    db.organizations.update(
        { "_id": doc._id },
        { "$set": { "state": doc.state.toUpperCase() } }
    );
});

使用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();

虽然基本上仍然在循环结果,但是写入操作只会在每500个文档或您选择的其他数量时发送到数据库,以保持在16MB BSON限制范围内。


没有一个可用。MongoDB 报错 'TypeError:doc.state.toUpper 不是一个函数 (shell):4'。 - Som Poddar
@SomPoddar 你一定是输入了不同的内容。toUpper() 是 JavaScript 内置的用于字符串类型对象的函数。我们已经检查过它的存在,那么有可能你的某些数据实际上是 null 或其他不是字符串类型的数据吗?你是否确实在声明 doc 变量的 .forEach() 循环内运行这个代码?基本的代码已经被执行了成千上万次,所以是可以正常工作的。请检查你正在做什么。 - Neil Lunn
@NeilLunn JavaScript内置函数是String.prototype.toUpperCase() - Danziger

2
你需要这样使用toUpperCase()
"$set": { "state": doc.state.toUpperCase() } }

10
这个答案让人困惑,不太有意义。"doc"是什么,它来自哪里?@Neil Lunn提供了更全面的答案。 - IcedDante

0
以下代码可以一步完成您想要的操作:
db.organizations.updateMany( { state: { $exists : true } }, [ { $set: { state: { $toUpper: "$state" } } } ] );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接