Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB Shell:是否可以使用函数执行更新查询?_Mongodb - Fatal编程技术网

MongoDB Shell:是否可以使用函数执行更新查询?

MongoDB Shell:是否可以使用函数执行更新查询?,mongodb,Mongodb,我收集了如下数据: [{ _id: 1, address: '1/23 Fake Street' }, { _id: 2, address: '5/20 Whatever Lane' }, { _id: 3, address: '10 Foo Avenue' }] const cursor = db.items.find({}); for await (const item of cursor) { try { aw

我收集了如下数据:

[{
    _id: 1,
    address: '1/23 Fake Street'
},
{
    _id: 2,
    address: '5/20 Whatever Lane'
},
{
    _id: 3,
    address: '10 Foo Avenue'
}]
  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
       }
   })
}
我想执行Mongo批量更新查询,它执行以下操作:

  • 地址
    字段转换为小写
  • 创建一个新字段“buildingAddress”,该字段在斜杠处拆分地址(如有,与前两项相同),并使用其后面的文本填充新字段
  • 在Node中,我将执行以下操作:

    [{
        _id: 1,
        address: '1/23 Fake Street'
    },
    {
        _id: 2,
        address: '5/20 Whatever Lane'
    },
    {
        _id: 3,
        address: '10 Foo Avenue'
    }]
    
      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 4.2+,那么可以使用聚合或管道形式的更新来完成

    将字符串转换为小写

    分场

    或选择要保留的元素

    一种可能的更新方法:

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

    如果您使用的是MongoDB 4.2+,那么可以使用聚合或管道形式的更新来实现这一点

    将字符串转换为小写

    分场

    或选择要保留的元素

    一种可能的更新方法:

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

    你可以在MongoShell中运行js脚本你可以在MongoShell中运行js脚本这就是我要找的。$split方法中的小错误=>这需要gto映射到数组,比如:
    {$split:[“$address”,“/”]},
    很好。我完全错了。这就是我要找的。$split方法中的小错误=>这需要gto映射到数组,比如:
    {$split:[“$address”,“/”]},
    很好。我完全错了。