【问题标题】:MongoDB Shell: Is it possible do an update query using a function?MongoDB Shell:是否可以使用函数进行更新查询?
【发布时间】:2020-09-03 09:41:26
【问题描述】:

我有一个包含这样数据的集合:

[{
    _id: 1,
    address: '1/23 Fake Street'
},
{
    _id: 2,
    address: '5/20 Whatever Lane'
},
{
    _id: 3,
    address: '10 Foo Avenue'
}]

我想执行 Mongo 批量更新查询,它执行以下操作:

  1. address 字段转换为小写
  2. 创建一个新字段“buildingAddress”,它在斜杠处拆分地址(如果存在,与前两项一样)并使用其后面的文本填充新字段

在 Node 中,我会这样做:

  const cursor = db.items.find({});

  for await (const item of cursor) {
    try {
      await pageMapper(item);
    } catch (e) {
      console.error(e);
    }
  }

async function pageMapper(item){
   const newAddress = item.address.toLowerCase()
   const buildingAddress = newAddress.split('/ ')[1];

   return db.items.updateOne(item._id, {
      $set: { 
         address: newAddress, 
         buildingAddress
       }
   })
}

我想知道是否有办法在 MongoDB shell 本身中执行此操作,将函数传递给 db.collection.update?还是我应该坚持使用节点驱动来进行更复杂的更新操作?

【问题讨论】:

标签: mongodb


【解决方案1】:

如果您使用的是 MongoDB 4.2+,您可以使用聚合或更新的管道形式来完成。

$toLower 将字符串转换为小写

$split 拆分字段

$slice$arrayElemAt 选择要保留的元素

一种可能的更新方式:

db.items.updateMany({},[
    {$addFields:{ 
      address:{$toLower:"$address"}
    }},
    {$addFields:{
        buildingAddress:{
            $arrayElemAt:[
                {$split:["$address","/"]},
                -1
            ]
        }
     }}
])

【讨论】:

  • 这就是我要找的。 $split 方法中的小错误 => 这需要 gto 映射到数组,例如:{$split: ["$address","/"]},
  • 好收获。我完全错了。
猜你喜欢
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多