我想将所有“组织”的“状态”字段转换为全部大写。“Ky”变为“KY”“tX”变为“TX”“ca”变为“CA”为什么这行不通db.organizations.update(state:{ $exists : true }},{$set:{state:{ $toUpper : state }}}, false, true)
db.organizations.update(state:{ $exists : true }},{$set:{state:{ $toUpper : state }}}, false, true)
vhmi4jdf1#
您引用的$toLower和$toUpper运算符只能与aggregation framework一起使用,它们本身不会像.update()语句那样更改集合中的文档。此外,目前还不能引用update语句中现有字段的值来生成新值。您需要做的是“循环”集合并进行更改:
$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限制之下),写入只发送到数据库一次。
ycl3bljg2#
toUpperCase()必须这样写:
toUpperCase()
"$set": { "state": doc.state.toUpperCase() } }
34gzjxbg3#
下面的代码在一个步骤中完成了您所希望的操作:db.organizations.updateMany( { state: { $exists : true } }, [ { $set: { state: { $toUpper: "$state" } } } ] );
db.organizations.updateMany( { state: { $exists : true } }, [ { $set: { state: { $toUpper: "$state" } } } ] );
3条答案
按热度按时间vhmi4jdf1#
您引用的
$toLower
和$toUpper
运算符只能与aggregation framework一起使用,它们本身不会像.update()
语句那样更改集合中的文档。此外,目前还不能引用update语句中现有字段的值来生成新值。您需要做的是“循环”集合并进行更改:
在MongoDB 2.6或更高版本中,您可以使用批量操作API来使这一点做得更好:
虽然基本上仍然是循环结果,但每500个文档或您选择的任何设置(保持在操作的16MB BSON限制之下),写入只发送到数据库一次。
ycl3bljg2#
toUpperCase()
必须这样写:34gzjxbg3#
下面的代码在一个步骤中完成了您所希望的操作:
db.organizations.updateMany( { state: { $exists : true } }, [ { $set: { state: { $toUpper: "$state" } } } ] );