首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用$toLower或$toUpper更新$toLower集合

用$toLower或$toUpper更新$toLower集合
EN

Stack Overflow用户
提问于 2014-06-24 23:40:46
回答 2查看 9.4K关注 0票数 9

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

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

为什么这不管用

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-07 05:23:38

你必须把toUpperCase()写成这样:

代码语言:javascript
复制
"$set": { "state": doc.state.toUpperCase() } }
票数 2
EN

Stack Overflow用户

发布于 2014-06-25 00:23:10

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

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

代码语言:javascript
复制
db.organizations.find({ "state": { "$exists": true } }).forEach(function(doc) {
    db.organizations.update(
        { "_id": doc._id },
        { "$set": { "state": doc.state.toUpperCase() } }
    );
});

使用MongoDB 2.6或更高版本,可以使用大容量操作API使其更好:

代码语言:javascript
复制
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个文档发送一次,或者任何您选择的操作保持在16 to BSON限制内的任何文件。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24398045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档