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

nc1teljy  于 2023-03-01  发布在  Go
关注(0)|答案(3)|浏览(106)

我想将所有“组织”的“状态”字段转换为全部大写。
“Ky”变为“KY”“tX”变为“TX”“ca”变为“CA”
为什么这行不通
db.organizations.update(state:{ $exists : true }},{$set:{state:{ $toUpper : state }}}, false, true)

vhmi4jdf

vhmi4jdf1#

您引用的$toLower$toUpper运算符只能与aggregation framework一起使用,它们本身不会像.update()语句那样更改集合中的文档。此外,目前还不能引用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限制之下),写入只发送到数据库一次。

ycl3bljg

ycl3bljg2#

toUpperCase()必须这样写:

"$set": { "state": doc.state.toUpperCase() } }
34gzjxbg

34gzjxbg3#

下面的代码在一个步骤中完成了您所希望的操作:
db.organizations.updateMany( { state: { $exists : true } }, [ { $set: { state: { $toUpper: "$state" } } } ] );

相关问题