我想将所有“组织”的“状态”字段转换为所有大写。所以
'Ky' 变成 'KY' 'tX' 变成 'TX' 'ca' 变成 'CA'
为什么这不起作用
db.organizations.update(state:{ $exists : true }},{$set:{state:{ $toUpper : state }}}, false, true)
您引用的$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)
| 归档时间: |
|
| 查看次数: |
7026 次 |
| 最近记录: |