Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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
Arrays 将字符串前缀添加到MongoDb中数组中对象的字段_Arrays_Mongodb - Fatal编程技术网

Arrays 将字符串前缀添加到MongoDb中数组中对象的字段

Arrays 将字符串前缀添加到MongoDb中数组中对象的字段,arrays,mongodb,Arrays,Mongodb,我有很多这样的mongoDb文档 { store:"Jacks Pizza", storeNumbers:[ { "chef":"Giovanni", "number":"7203305544" } ] }, store:"Felicias Kitchen", storeNumbers:[ { "chef":"G

我有很多这样的mongoDb文档

{
store:"Jacks Pizza",
storeNumbers:[
  {
    "chef":"Giovanni",
    "number":"7203305544"
  }
]
},
store:"Felicias Kitchen",
storeNumbers:[
  {
    "chef":"Gina",
    "number":"+19161214594"
  }
]
我想在所有没有+1国家代码的数字后面加一个“+1”前缀

这是我试过的-

db.users.updateMany({ 
    "storeNumbers.number" :  { 
        $exists: true, 
        $ne:"", 
        $regex: /^(?!\+)^(?![a-zA-Z])/ 
      } 
    }, 
    [ { 
        $set : { 
            "storeNumbers.$.number" : { 
                "$concat": [ "+1" , "$storeNumbers.$.number"]
                }
            }
        } 
    ] 
);
这给了我一个错误,说明我无法对数组中的元素执行concat


您将如何做到这一点?

没有直接的方法可以做到这一点,您可以使用从MongoDB 4.2开始

  • 如果正则表达式与数字开头的“+1”字符串不匹配,则进行匹配查询
  • $map
    迭代
    storeNumbers
  • $cond
    如果
    数字
    与数字开头的“+1”字符串不匹配且数字字段不是字符串和字符串类型,则使用
    $concat
    检查条件,否则不执行任何操作
  • $mergeObjects
    将当前对象与新更新合并
    编号
    字段

回答得很好,尝试阅读了很多有关阵列上运算符的内容,但没有找到解决方案。
db.users.updateMany({
  "storeNumbers.number": {
    $exists: true,
    $ne: "",
    $not: {
      $regex: "^\\+1"
    }
  }
},
[
  {
    $set: {
      storeNumbers: {
        $map: {
          input: "$storeNumbers",
          in: {
            $mergeObjects: [
              "$$this",
              {
                $cond: [
                  {
                    $and: [
                      {
                        $not: {
                          $regexMatch: {
                            input: "$$this.number",
                            regex: "^\\+1"
                          }
                        }
                      },
                      {
                        $ne: ["$$this.number", ""]
                      },
                      {
                        $eq: [{ $type: "$$this.number" }, "string"]
                      }
                    ]
                  },
                  {
                    number: {
                      $concat: ["+1", "$$this.number"]
                    }
                  },
                  {}
                ]
              }
            ]
          }
        }
      }
    }
  }
])