使用$ toLower更新MongoDB集合

sve*_*h42 32 mongodb

我有一个包含用户名的现有MongoDB集合.用户名包含小写字母和大写字母.我想更新所有用户名,因此它们只包含小写字母.我试过这个脚本,但是没用

db.myCollection.find().forEach(
 function(e) {
 e.UserName = $toLower(e.UserName);
 db.myCollection.save(e);
 }
)
Run Code Online (Sandbox Code Playgroud)

斯科特,非常感谢任何关于让它工作的信息

Gat*_* VP 60

MongoDB没有$toLower作为命令的概念.解决方案是对数据运行一个大for循环并单独发布更新.

您可以在任何驱动程序或shell中执行此操作:

db.myCollection.find().forEach(
  function(e) {
    e.UserName = e.UserName.toLowerCase();
    db.myCollection.save(e);
  }
)
Run Code Online (Sandbox Code Playgroud)

您还可以使用原子更新替换保存:

db.myCollection.update({_id: e._id}, {$set: {UserName: e.UserName.toLowerCase() } })
Run Code Online (Sandbox Code Playgroud)

同样,您也可以从任何驱动程序执行此操作,代码将非常相似.


编辑:雷蒙提出了一个好点.该$toLower命令确实作为聚合框架的一部分存在,但这与更新无关.更新文档在这里.

  • 实际上从2.1开始,MongoDB确实有$ toLower,但它只是聚合框架中的表达式;) (3认同)
  • 你把`update()`放在`forEach`循环中吗? (2认同)

Xav*_*hot 35

开始Mongo 4.2db.collection.update()可以接受聚合管道,最后允许根据自己的值更新字段:

// { username: "Hello World" }
db.collection.update(
  {},
  [{ $set: { username: { $toLower: "$username" } } }],
  { multi: true }
)
// { username: "hello world" }
Run Code Online (Sandbox Code Playgroud)
  • 第一部分{}是匹配查询,过滤要更新的文档(在本例中为所有文档)。

  • 第二部分[{ $set: { username: { $toLower: "$username" } } }],是更新聚合管道(注意方括号表示使用聚合管道):

    • $set是一个新的聚合运算符,在这种情况下会修改 的值"username"
    • 使用$toLower,我们"username"通过其小写版本修改 的值。
  • 不要忘记{ multi: true },否则只会更新第一个匹配的文档。