如何通过MongoDb Shell将字符串字段转换为对象数组中的ObjectId? updateMany

问题描述

所以我的MongoDb文档看起来像这样:

{
    "_id" : ObjectId("5f1842d238ec58056d94bbb3"),"itemsPurchased" : [ 
        {
            "_id" : "5e7365360665d10011756af2","created" : "2020-03-19T12:27:34.108Z","productLine" : "5ce8ec9df5cc72002fee0d4e","price" : 1.9,"tax" : 7,"ean" : "42272120","expirationDate" : "2020-06-17T12:27:34.103Z","kiosk" : "5c17a3d963ca649138ec522c","loadCell" : "1"
        },{
            "_id" : "5e7365360665d10011756af3","loadCell" : "1"
        }
    ],"paymentMethod" : [],"type" : "purchase","total" : NumberDecimal("3.8"),"session" : ObjectId("5f1842bf1f2028e369d945f0"),"orgId" : ObjectId("5cddce9a51cbb2002d636741"),"created" : ISODate("2020-07-22T13:44:50.973Z"),"updated" : ISODate("2020-07-22T13:44:50.973Z"),"__v" : 0
}

问题在于,在itemsPurchased []中(由于逻辑错误),存在id类型的id。例如"_id" : "5e7365360665d10011756af2""productLine" : "5ce8ec9df5cc72002fee0d4e"。如何遍历在itemsPurchased []中具有对象的所有文档,该文档具有字符串而不是ObjectIds,并将其转换为ObjectId类型。我尝试将$ convert和$ toObjectId与$ map一起使用,但似乎无法正确处理。

db.transactions.aggregate([
  { "$match": { "itemsPurchased._id": {$type: "string"}}},{ "$set": "itemsPurchased1": {
      "$map": {
        "input": "$itemsPurchased","in": {
          "$toObjectId": [
            "$$this",{
              "productLine": {
                "$toObjectId": "$$this.productLine"
              }
            }
          ]
        }
      }
    }
  }

无法正确显示地图部分

解决方法

您已正确使用$toObjectId,在$mergeObjects中与$toObjectId合并时,只需更改$$this而不是$map

  {
    "$set": {
      "itemsPurchased1": {
        "$map": {
          "input": "$itemsPurchased","in": {
            "$mergeObjects": ["$$this",{ "productLine": { "$toObjectId": "$$this.productLine" } }]
          }
        }
      }
    }
  }

Playground


updateMany

db.transactions.updateMany({},[
  {
    "$set": {
      "itemsPurchased": {
        "$map": {
          "input": "$itemsPurchased",{ "productLine": { "$toObjectId": "$$this.productLine" } }]
          }
        }
      }
    }
  }
])
,
db.getCollection('transactions').update(
{"itemsPurchased.kiosk":{$type: "string"}},[{
    "$set": {
      "itemsPurchased": {
        "$map": {
          "input": "$itemsPurchased","in": {
            "$mergeObjects": [
              "$$this",{
                "kiosk": {
                  "$toObjectId": "$$this.kiosk"
                }
              }
            ]
          }
        }
      }
    }
  }],{multi:true})

这是更新方式...

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...